PowerBuilder提供的BLOB(Binary Large Object)数据类型可以用来处理大型数据包括图像大文本Word文档二进制文件和多媒体等各种数据它的长度可以是~GB字节我们利用BLOB类型的变量可以将数据传递给数据库以大字段方式存储但是用通常的数据窗口技术无法将BLOB类型数据加入到数据库中也不能将数据库中相应字段的数据提取出来即使在程序中直接使用UPDATE和SELECT等SQL语句也是无法对BLOB类型数据进行操作的下面笔者将介绍在PowerBuilder 中操作BLOB类型数据的技巧
程序设计原理
在PB中实现BLOB类型数据的入库和查询主要要用到两条特殊的SQL命令UPDATEBLOB和SELECTBLOB首先定位要进行操作的记录然后使用UPDATEBLOB命令就可以将BLOB类型变量中存放的数据传递给数据库而使用SELECTBLOB则是将指定记录中的大字段数据传递给BLOB变量
使用BLOB类型变量获取外界文件的数据内容还必须借助于PB提供的可视化OLE控制对象通过它可以将指定的文件内容显示成相应的对象(如BMP图片)双击它就可以激活相应的OLE服务器应用程序来编辑修改对象的内容同时也可以读取对象的数据内容(利用OLE控件的ObjectData属性)给BLOB类型变量赋值
下面结合一个简单的程序实例讲述如何处理BLOB数据类型在这个例子中BMP图片将作为一个大字段存储在数据库中我们选择Microsoft Access 作为后台数据库它的字段类型中包含OLE对象类型(如果选择MS SQL Server作为数据库服务器可以使用TEXT或IMAGE类型字段存放大字段数据)这样就为管理多媒体数据大文件和图片提供了支持
操作BLOB字段的实现过程
我们在Access中创建一个新的数据库文件文件名是bmpmdb
各字段的其它设置(如字段宽度等)均采用缺省形式即可
编程前还需要做的一步准备工作是在操作系统的ODBC配置中建立指向bmpmdb数据库的连接名称定为bmptable
下面的程序片段实现了数据库的连接图片的插入更新删除和查询考虑文章的篇幅本文只列出与主题相关的程序源码
连接Access数据库
SQLCADBMS = ODBC
// SQLCA为全局transaction事务变量
SQLCAAutoCommit = False
SQLCADBParm = Connectstring=DSN=bmptable;UID=;PWD=
CONNECT USING SQLCA;
If SQLCA SQLCode <> Then
MessageBox (数据库错误 连接失败!)
Halt close;
End If
将BMP图片存入数据库
integer bmpnoicount
//变量bmpno存放给定的图片编号
string filepathfilename
blob blb_tmp
//…此处对图片编号bmpno赋值例如bmpno=;可以通过程序实现为弹出对话框窗口提供一个图片编号
//查询指定的图片编号是否已经存在
icount=
SELECT COUNT() INTO :icount
FROM bmptable
WHERE bmptablebmpno=:bmpno
USING SQLCA; //:bmpno为给定的图片编号
if icount> then
MessageBox(查询结果string(bmpno)+ 号图片已经存在请输入一个新的图片编号)
return
end if
//在OLE控制对象ole_中插入BMP图片文件
GetFileOpenName(请选择一个需要插入的BMP图片文件filepathfilenameBMPBMP图片文件(BMP)BMP)
If Len(filepath)= Then
Return
End If
If ole_InsertFile(filepath)<> Then //OLE错误
Return
End If
//新图片入库
string sql
sql= INSERT INTO bmptable (bmpnobmpdatabmpname) &&
VALUES (&&
+string(bmpno)+&&
+filename+)
EXECUTE IMMEDIATE :sql;
If SQLCASQLDBCode= Then
COMMIT USING SQLCA;
[] []