很久没用过PB了,网上找了一篇,大致看了一下,应该没什么问题
--转自51CTO论坛
在PowerBuilder里面操作BLOB数据地灵活技术
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如下:
各字段的其它设置(如字段宽度等),均采用缺省形式即可。
编程前还需要做的一步准备工作是在操作系统的ODBC配置中建立指向bmp.mdb数据库的连接,名称定为bmptable。
下面的程序片段实现了数据库的连接,图片的插入、更新、删除和查询。考虑文章的篇幅,本文只列出与主题相关的程序源码。
1. 连接Access数据库
SQLCA.DBMS = "ODBC"
// SQLCA为全局transaction事务变量
SQLCA.AutoCommit = False
SQLCA.DBParm = "Connectstring='DSN=bmptable;UID=WD='"
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结构的数据库应用程序。
温馨提示:内容为网友见解,仅供参考
pb中怎样在数据窗口显示一张表
首先要新建一个数据库窗口,打开NEW窗口,选择 datawindow 选项卡,会有多种数据表显示样式可以选择,这里演示一下常用的 grid 样式 选择 grid ,然后选择选择数据表的方式,这里演示一下 sql select方式 选择 sql select 之后,选择要显示的表,例表:ssc 接下了,选择需要显示的列 这个界面菜单的 desi...
pbdatawindowretrieve怎么用
PBDataWindowRetrieve的核心是Retrieve方法。通过编写SQL语句或其他查询逻辑,使用Retrieve方法从数据库检索数据。这个方法可以根据条件返回查询结果,并将数据填充到DataWindow对象中。4. 在界面上显示或处理获取的数据 获取数据后,可以在界面上以表格、列表等形式展示,也可以进行进一步的数据处理。DataWindow提供...
急求pb考勤管理系统(pb+access)论文
1:函数名:open( ) 作用:将数据窗口和数据库连接,并且显示数据库存在的数据代码:dw_1.settransobject(sqlca)dw_1.retrieve()2:函数名:pb_1。Clicked()作用:插入一条新记录代码:dw_1.insertrow(0)3:函数名:pb_2。Clicked()作用:删除一条当前记录代码:dw_1.deleterow(0)4:函数名:pb_3。Clicked()作用:...
...文件,并把文件内容读取到SQL Server数据库中? 希望能给出代码...
1. 最简单的方法,用datawindow将数据倒入,然后再逐一处理。具体就是建一个字段数量和类型与要倒入的文件中字段相同的dw,然后dw_1.importfile('文件路径+文件名')2.使用fileopen() 打开文件,然后用filewrite() 逐一写入每一行数据, 定位tab (~t)如:do while pos(ls_str,'~t') >0 ls_ret...
为什么我的PB程序运行时不能够显示数据库中的信息,在数据窗口能够查看到...
运行时需要在入口窗口的open时间中加入数据库的连接配置信息,还有就是将dataWindow的DataObject要设置一个下,下面再加入:dw_1.settransobject(sqlca);dw_1.retrieve() ;
在PB中用OLE存取blob类型数据(二)
在PB 的datawindow画板中DBOLE控件允许用户利用这个控件浏览和操作数据库中的大二进制数据 即通过DBOLE控件可以作如下操作 往数据库中存储大二进制数据 如 excel工作表 word文档 视频文件 图片文件等各种格式的文件 从数据库中检索数据到datawindow对象 使用OLE服务器程序察看修改数据 ...
PB中导出EXCEL请教!
打开你的程序,展开System tree,在library图标上右击,点击import。将刚才的f_pbtoexcel.srf导进来。用法:双击按钮,然后在按钮的click事件里输入 f_pbtoexcel(dw_1) 即可,其中dw_1是数据窗口的名称。global type f_pbtoexcel from function_object end type forward prototypes global function ...
powerbuilder7中 datawindow不显示数据
datawindow放入window后,它是不会自动刷新数据的,需要写代码。写在window的open事件中就行:\/\/---首先保证你的sqlca已经成功连接到你的数据库 dw_1.settransobject(sqlca)dw_1.retrieve()
PowerBuilder鲜为人知但又绝对好用的技巧和窍门
用户将一条SQL语句输入到DataWindow中 然后点击 Execute(执行) 检索结果就会出现在下面的区域 用户还可以将数据结果另存为Excel等等 如果用户需要更详细的SQL语句 您可以写下来然后e mail给他 用户只需要拷贝粘贴到窗体里就可以执行了 这种方法可以用于清理数据库问题 创建或执行stored procedures 创建特别的报告 甚至...
在ACCESS数据库中,怎样把一个表的某些字段的某些记录复制到另一个表
可先用数据管道在PB中建立(或导入到)一个数据库,在通过数据窗口保存为你想要的任何格式的文件包括excelString ls_File, ls_Path, ls_ExtInteger li_Valueli_Value = GetFileSaveName ("打印到文件", ls_Path, ls_File, "DOC", &"文本文件; (*.CSV), *.CVS," + &"文本文件Tab (*.TXT), *.TXT...