数据库

本类阅读TOP10

·SQL语句导入导出大全
·SQL Server日期计算
·SQL语句导入导出大全
·SQL to Excel 的应用
·Oracle中password file的作用及说明
·MS SQLServer OLEDB分布式事务无法启动的一般解决方案
·sqlserver2000数据库置疑的解决方法
·一个比较实用的大数据量分页存储过程
·如何在正运行 SQL Server 7.0 的服务器之间传输登录和密码
·SQL中两台服务器间使用连接服务器

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
在PowerBuilder中操作BLOB数据的技巧

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

PowerBuilder提供的BLOB(Binary Large Object)数据类型可以用来处理大型数据,包括图像、大文本、Word文档、二进制文件和多媒体等各种数据,它的长度可以是0~2GB字节,我们利用BLOB类型的变量可以将数据传递给数据库以大字段方式存储。但是用通常的数据窗口技术无法将BLOB类型数据加入到数据库中,也不能将数据库中相应字段的数据提取出来,即使在程序中直接使用UPDATE和SELECT等SQL语句也是无法对BLOB类型数据进行操作的。下面笔者将介绍在PowerBuilder 7.0中操作BLOB类型数据的技巧。

程序设计原理

在PB中实现BLOB类型数据的入库和查询,主要要用到两条特殊的SQL命令--UPDATEBLOB和SELECTBLOB,首先定位要进行操作的记录,然后使用UPDATEBLOB命令就可以将BLOB类型变量中存放的数据传递给数据库,而使用SELECTBLOB则是将指定记录中的大字段数据传递给BLOB变量。

使用BLOB类型变量获取外界文件的数据内容,还必须借助于PB提供的可视化OLE控制对象,通过它可以将指定的文件内容显示成相应的对象(如BMP图片),双击它就可以激活相应的OLE服务器应用程序,来编辑修改对象的内容,同时也可以读取对象的数据内容(利用OLE控件的ObjectData属性),给BLOB类型变量赋值。

下面结合一个简单的程序实例,讲述如何处理BLOB数据类型。在这个例子中,BMP图片将作为一个大字段存储在数据库中。我们选择Microsoft Access 2000作为后台数据库,它的字段类型中包含“OLE对象”类型(如果选择MS SQL Server作为数据库服务器,可以使用TEXT或IMAGE类型字段存放大字段数据),这样就为管理多媒体数据、大文件和图片提供了支持。

操作BLOB字段的实现过程

我们在Access中创建一个新的数据库文件,文件名是bmp.mdb,在其中定义BMP图片数据表bmptable如下:

各字段的其它设置(如字段宽度等),均采用缺省形式即可。

列名
 字段类型
 能否为空
 备注
 
bmpno
 数字
 否
 图片编号(关键字)
 
bmpname
 文本
 能
 图片名称
 
bmpdata
 ole对象
 能
 图片(bmp)
 


编程前还需要做的一步准备工作是在操作系统的ODBC配置中建立指向bmp.mdb数据库的连接,名称定为bmptable。

下面的程序片段实现了数据库的连接,图片的插入、更新、删除和查询。考虑文章的篇幅,本文只列出与主题相关的程序源码。

1. 连接Access数据库


SQLCA.DBMS = "ODBC"
// SQLCA为全局transaction事务变量
SQLCA.AutoCommit = False
SQLCA.DBParm = "Connectstring='DSN=bmptable;UID=;PWD='"
CONNECT USING SQLCA;
If SQLCA. SQLCode <> 0 Then
MessageBox ("数据库错误", "连接失败!")
Halt close;
End If


2. 将BMP图片存入数据库


integer bmpno,icount
//变量bmpno存放给定的图片编号
string filepath,filename
blob blb_tmp
//…此处对图片编号bmpno赋值,例如bmpno=101;可以通过程序实现为弹出对话框窗口提供一个图片编号
//查询指定的图片编号是否已经存在
icount=0
SELECT COUNT() INTO :icount
FROM bmptable
WHERE bmptable.bmpno=:bmpno
USING SQLCA; //:bmpno为给定的图片编号
if icount>0 then
MessageBox("查询结果",string(bmpno)+" 号图片已经存在,请输入一个新的图片编号")
return
end if
//在OLE控制对象ole_1中插入BMP图片文件
GetFileOpenName("请选择一个需要插入的BMP图片文件",filepath,filename,"BMP","BMP图片文件(.BMP),.BMP")
If Len(filepath)=0 Then
Return
End If
If ole_1.InsertFile(filepath)<>0 Then //OLE错误
Return
End If
//新图片入库
string sql
sql= "INSERT INTO bmptable (bmpno,bmpdata,bmpname) &&
VALUES ("&&
+string(bmpno)+",'','"&&
+filename+"')"
EXECUTE IMMEDIATE :sql;
If SQLCA.SQLDBCode=0 Then
COMMIT USING SQLCA;
//提交事务
Else
MessageBox("数据库错误","插入失败")
ROLLBACK USING SQLCA;
//事务回滚
Return
End If
Blb_tmp=ole_1.ObjectData
UPDATEBLOB bmptable SET bmpdata=:blb_tmp
WHERE bmptable.bmpno=:bmpno
USING SQLCA; //更新存放图片的字段
If SQLCA.SQLDBCode=0 Then
COMMIT USING SQLCA;
//提交事务
MessageBox("插入成功","图片入库成功")
Else
MessageBox("数据库错误","更新图片失败")
ROLLBACK USING SQLCA;
//事务回滚
Return
End If


3. 从数据库中删除BMP图片


UPDATE bmptable SET bmpdata=''
WHERE bmptable.bmpno=:bmpno
USING SQLCA;
//bmpno为要删除的图片编号
If SQLCA.SQLDBCode=0 Then
COMMIT USING SQLCA;
//提交事务
Else
MessageBox("数据库错误","更新失败")
ROLLBACK USING SQLCA;
//事务回滚
Return
End If
DELETE FROM bmptable
WHERE bmptable.bmpno=:bmpno
USING SQLCA;
If SQLCA.SQLDBCode=0 Then
COMMIT USING SQLCA;
//提交事务
MessageBox("删除成功","图片删除成功")
Else
MessageBox("数据库错误","删除失败")
ROLLBACK USING SQLCA;
//事务回滚
Return
End If


4. 按图片编号查询图片信息


//需要提供一个图片编号存放在变量bmpno中
SetNull(blb_tmp)
SELECTBLOB bmptable.bmpdata INTO :blb_tmp
FROM bmptable
WHERE bmptable.bmpno=:bmpno
USING SQLCA;
If Not IsNull(blb_tmp) Then
ole_1.ObjectData=blb_tmp
//双击OLE控制唤醒OLE服务器即可编辑图片
End If


使用PB编程时,每次对数据库进行操作后要注意检查返回结果,以保证程序的可靠性。以上程序只是对操作BLOB数据类型的关键技术进行探讨,通过画板设计相应的用户界面,即可形成一个完整的基于Client/Server结构的数据库应用程序。

注:作者没有解决大于32K的图片处理问题。




相关文章

相关软件