大二进制对象(Blob)数据类型,若要存储一个任何种类的二进制数据,如 ASCII 码文本、一个可执行文件(.exe) 或一个带有不确定长度的字节字符串,可使用大二进制对象数据类型。对于从 SQL Server 中存储图像数据,大二进制对象数据类型显得特别有用。
你可以使用二进制的原文将值赋予一个大二进制对象字段。二进制原文以 0h 前缀开始,并跟随一个不用引号("")括起的十六进制的数字串(不同于字符串)。下面的列表包含了二进制原文的示例:
二进制原文被限定为 255 个编码字节。
也就是说二进制原文是直接可以保存表BLOB字段里面的。
大二进制对象类型被数据库容器(.dbc)、自由表、临时表和视图所支持。例如,可以在“表设计器”的“字段”选项卡中为字段选择该类型。表可以包含多个大二进制对象字段。可以为大二进制对象字段指定默认值和 Null 值。大二进制对象字段支持字段有效性。
可以使用 EditBox 控件、Grid 控件中的 TextBox 控件,或通过发出带有大二进制对象字段名的 MODIFY MEMO 命令来查看带有大二进制对象类型字段的内容,然而,该内容只读。编辑框将大二进制对象类型数据显示为不带 0h 前缀的十六进制值。在表格中,如果大二进制对象类型字段为空,就显示“blob”字符串,而如果包含数据,就显示“Blob”字符串。可以双击表格中的大二进制对象字段,而“编辑”窗口以只读方式显示该数据。
不支持基于大二进制对象字段的索引关键字。在带有大二进制对象类型的数据上,不执行代码页转换。(这个对于unicode的应用非常有用。)
现在我们再来看一下SQL查询数据类型转换,在默认的时候,后台Image字段会被转换为通用字段,这不是我们想要的,而是直接能转换为BLOB字段。
CURSORSETPROP命令有个参数“MapBinary”:
CURSORSETPROP("MapBinary",.t.,0) &&通过此命令将SQL2000的IMAGE字段 转换为BLOB
来看一下查询代码:
CURSORSETPROP("MapBinary",.t.,0) &&通过此命令将IMAGE 转换为BLOB
TEXT TO lcSQLCmd NOSHOW TEXTMERGE
SELECT * FROM test
ENDTEXT
oDBSQLHelper= NEWOBJECT("MSSQLHelper","MSSQLHelper.prg")
IF oDBSQLHelper.SQLQuery(lcSQLCmd,"test")<0
?oDBSQLHelper.errmsg
RETURN
ENDIF
If !Pemstatus(_Screen,"myimg",5)
oImage=_Screen.AddObject("myimg","image")
ENDIF
_Screen.myIMG.Left=400
_Screen.myIMG.width=400
_Screen.myIMG.height=400
_screen.myimg.Stretch=1
_Screen.myimg.PictureVal=image1
_Screen.myIMG.top=1
_Screen.myIMG.Visible=.T.
保存图片到SQL2000image字段也简单
*--将文件保存到BLOB字段
xxx=GETFILE()
yyy=0h+FILETOSTR(xxx)
TEXT TO lcSQLCmd NOSHOW TEXTMERGE
INSERT into test (image1) values(?yyy)
ENDTEXT
oDBSQLHelper= NEWOBJECT("MSSQLHelper","MSSQLHelper.prg")
IF oDBSQLHelper.ExeCuteSQL(lcSQLCmd)<0
?oDBSQLHelper.errmsg
RETURN
ENDIF
也有某位狐友说CA类做不到?
来生成一个DAL_CA类
少少的写一点代码看看:
一样的可以显示。
保存代码也看看
*--将文件保存到BLOB字段
xxx=GETFILE()
yyy=FILETOSTR(xxx)
odal_ca=NEWOBJECT("dal_test","dal_test.prg")
IF !odal_ca.cursorfill(.t.)
RETURN
ENDIF
APPEND BLANK
replace image1 WITH yyy IN odal_ca.alias
IF !odal_ca.save()
?odal_ca.msg
RETURN
ENDIF
猫框的数据处理真是用起来太爽了。