在PowerBuilder中操作BLOB数据的技巧.docx
- 文档编号:30073341
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:19
- 大小:85.71KB
在PowerBuilder中操作BLOB数据的技巧.docx
《在PowerBuilder中操作BLOB数据的技巧.docx》由会员分享,可在线阅读,更多相关《在PowerBuilder中操作BLOB数据的技巧.docx(19页珍藏版)》请在冰豆网上搜索。
在PowerBuilder中操作BLOB数据的技巧
在PowerBuilder中操作BLOB数据的技巧
PowerBuilder提供的BLOB(BinaryLargeObject)数据类型可以用来处理大型数据,包括图像、大文本、Word文档、二进制文件和多媒体等各种数据,它的长度可以是0~2GB字节,我们利用BLOB类型的变量可以将数据传递给数据库以大字段方式存储。
但是用通常的数据窗口技术无法将BLOB类型数据加入到数据库中,也不能将数据库中相应字段的数据提取出来,即使在程序中直接使用UPDATE和SELECT等SQL语句也是无法对BLOB类型数据进行操作的。
下面笔者将介绍在PowerBuilder7.0中操作BLOB类型数据的技巧。
程序设计原理
在PB中实现BLOB类型数据的入库和查询,主要要用到两条特殊的SQL命令——UPDATEBLOB和SELECTBLOB,首先定位要进行操作的记录,然后使用UPDATEBLOB命令就可以将BLOB类型变量中存放的数据传递给数据库,而使用SELECTBLOB则是将指定记录中的大字段数据传递给BLOB变量。
使用BLOB类型变量获取外界文件的数据内容,还必须借助于PB提供的可视化OLE控制对象,通过它可以将指定的文件内容显示成相应的对象(如BMP图片),双击它就可以激活相应的OLE服务器应用程序,来编辑修改对象的内容,同时也可以读取对象的数据内容(利用OLE控件的ObjectData属性),给BLOB类型变量赋值。
下面结合一个简单的程序实例,讲述如何处理BLOB数据类型。
在这个例子中,BMP图片将作为一个大字段存储在数据库中。
我们选择MicrosoftAccess2000作为后台数据库,它的字段类型中包含“OLE对象”类型(如果选择MSSQLServer作为数据库服务器,可以使用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='"
CONNECTUSINGSQLCA;
IfSQLCA.SQLCode<>0Then
MessageBox("数据库错误","连接失败!
")
Haltclose;
EndIf
2.将BMP图片存入数据库
integerbmpno,icount
//变量bmpno存放给定的图片编号
stringfilepath,filename
blobblb_tmp
//…此处对图片编号bmpno赋值,例如bmpno=101;可以通过程序实现为弹出对话框窗口提供一个图片编号
//查询指定的图片编号是否已经存在
icount=0
SELECTCOUNT()INTO:
icount
FROMbmptable
WHEREbmptable.bmpno=:
bmpno
USINGSQLCA;//:
bmpno为给定的图片编号
ificount>0then
MessageBox("查询结果",string(bmpno)+"号图片已经存在,请输入一个新的图片编号")
return
endif
//在OLE控制对象ole_1中插入BMP图片文件
GetFileOpenName("请选择一个需要插入的BMP图片文件",filepath,filename,"BMP","BMP图片文件(.BMP),.BMP")
IfLen(filepath)=0Then
Return
EndIf
Ifole_1.InsertFile(filepath)<>0Then//OLE错误Return
EndIf
//新图片入库
stringsql
sql="INSERTINTObmptable(bmpno,bmpdata,bmpname)&&
VALUES("&&
+string(bmpno)+",'','"&&
+filename+"')"
EXECUTEIMMEDIATE:
sql;
IfSQLCA.SQLDBCode=0Then
COMMITUSINGSQLCA;
//提交事务
Else
MessageBox("数据库错误","插入失败")
ROLLBACKUSINGSQLCA;
//事务回滚
Return
EndIf
Blb_tmp=ole_1.ObjectData
UPDATEBLOBbmptableSETbmpdata=:
blb_tmp
WHEREbmptable.bmpno=:
bmpno
USINGSQLCA;//更新存放图片的字段
IfSQLCA.SQLDBCode=0Then
COMMITUSINGSQLCA;
//提交事务
MessageBox("插入成功","图片入库成功")
Else
MessageBox("数据库错误","更新图片失败")
ROLLBACKUSINGSQLCA;
//事务回滚
Return
EndIf
3.从数据库中删除BMP图片
UPDATEbmptableSETbmpdata=''
WHEREbmptable.bmpno=:
bmpno
USINGSQLCA;
//bmpno为要删除的图片编号
IfSQLCA.SQLDBCode=0Then
COMMITUSINGSQLCA;
//提交事务
Else
MessageBox("数据库错误","更新失败")
ROLLBACKUSINGSQLCA;
//事务回滚
Return
EndIf
DELETEFROMbmptable
WHEREbmptable.bmpno=:
bmpno
USINGSQLCA;
IfSQLCA.SQLDBCode=0Then
COMMITUSINGSQLCA;
//提交事务
MessageBox("删除成功","图片删除成功")
Else
MessageBox("数据库错误","删除失败")
ROLLBACKUSINGSQLCA;
//事务回滚
Return
EndIf
4.按图片编号查询图片信息
//需要提供一个图片编号存放在变量bmpno中
SetNull(blb_tmp)
SELECTBLOBbmptable.bmpdataINTO:
blb_tmp
FROMbmptable
WHEREbmptable.bmpno=:
bmpno
USINGSQLCA;
IfNotIsNull(blb_tmp)Then
ole_1.ObjectData=blb_tmp
//双击OLE控制唤醒OLE服务器即可编辑图片
EndIf
使用PB编程时,每次对数据库进行操作后要注意检查返回结果,以保证程序的可靠性。
以上程序只是对操作BLOB数据类型的关键技术进行探讨,通过画板设计相应的用户界面,即可形成一个完整的基于Client/Server结构的数据库应用程序。
如何在PB中通过读取硬盘序列号实现软件加密
--------------------------------------------------------------------------------
大家知道,每当我们格式化软盘或硬盘时系统都会给它分配一个序列号,即用DOS命令dir显示出的"Volume Serial Number is 0A41-0E0A"。
该序列号是随机产生的,且具有唯一性。
也就是因为这个原因许多软件的测试版本利用该项技术使测试版一旦过了限定期限就不能再使用,即使将该软件重新安装也无济于事。
另外,有些共享软件的注册码也是通过这个序列号来生成的。
同样的方法我们也可以运用到软件的防拷贝技术。
那么如何才能实现上述功能呢?
为了达到目的我们必须首先能够得到硬盘的序列号,其次,为了安全起见我们最好再选择一种加密算法,将加密后的硬盘的序列号作为密文公开存放,软件通过解密得到明文,即硬盘的序列号,通过将解密后的硬盘序列号和实际的硬盘序列号相比较得出程序是否合法。
这一步当然是由应用程序秘密运行,用户根本不知道,从而达到软件的二次加密目的,同时也隐藏了软件的合法性识别过程,使破译者无从下手。
下面就来谈谈如何具体实现。
一、如何读取硬盘序列号
要读取硬盘序列号我们可以用汇编来实现,但毕竟不容易,况且也不能有效的结合到PB脚本中。
在PB中我们可以通过调用Windows提供的外部函数GetVolumeInformationA()来实现。
这相对来说比较简单。
该函数的原型为:
BOOL GetVolumeInformation(
LPCTSTR lpRootPathName,
LPTSTR lpVolumeNameBuffer,
DWORD nVolumeNameSize,
LPDWORD lpVolumeSerialNumber,
LPDWORD lpMaximumComponentLength,
LPDWORD lpFileSystemFlags,
LPTSTR lpFileSystemNameBuffer,
DWORD nFileSystemNameSize
上述原型中,参数类型只要是以"LP-"开头的表明该参数用的是长指针(Long Pointer)类型,即在PB中调用时的参数传递是通过引用传递。
在8个参数中对我们真正有用的只有两个LPCTSTR lpRootPathName和LPDWORD lpVolumeSerialNumber。
其中参数lpRootPathName是指向文件系统根目录的地址,我们需要用它来指明所要获取序列号的硬盘盘符;参数lpVolumeSerialNumber是返回的硬盘序列号的地址,这正是我们需要的。
众所周知,PB在调用任何外部函数前都要首先进行函数声明,可以将声明放在全局或局部函数声明中。
具体声明如下:
Function Boolean GetVolumeInformationA( &
ref String ls_Rootpath, &
ref String ls_volumnename, &
Ulong lul_VolumeNameSize, ref Ulong lul_VolumeSerialNumber, &
ref Ulong lul_MaximumComponentLength, &
ref Ulong lul_FileSystemFlags, &
ref String ls_FileSystemNameBuffer, &
Ulong lul_FileSystemNameSize &
) Library "Kernel32.dll"
上述声明中,"ref"指明是该参数是通过引用传递的,有关函数引用的详细内容请参见有关教程。
声明完毕我们不能马上进行调用,还必需确保已为它分配足够的内存空间,即使是参数引用传递也是这样,否则的话将会出现调用错误,这跟C语言的引用调用不同,这一点往往被忽视,希望读者能够注意。
也就是为什么我在调用该函数前将有些字符串参数给它预先分配了多达256个字符空间以及给一些整型类型的参数赋初始值256。
完整的读取硬盘序列号的程序代码如下:
/******************* 程序代码 ************************/
String ls_Rootpath, ls_volumnename
ls_Rootpath = "C:
" // 指定要得到序列号的硬盘,
// 一般情况都是C盘,除非你能保证用户存在其它逻辑盘或物理盘
ls_volumnename = Space(256) // 分配足够的空间,下同
Ulong lul_VolumeNameSize
lul_VolumeNameSize = 256
Ulong lul_VolumeSerialNumber, lul_MaximumComponentLength, lul_FileSystemFlags
lul_MaximumComponentLength = 256
String ls_FileSystemNameBuffer
ls_FileSystemNameBuffer = space(256)
Ulong lul_FileSystemNameSize
lul_FileSystemNameSize = 256
beep
(1)
boolean lb_rtn
lb_rtn = False
lb_rtn = GetVolumeInformationA(ls_Rootpath, ls_volumnename, lul_VolumeNameSize,
lul_VolumeSerialNumber, lul_MaximumComponentLength, lul_FileSystemFlags,
ls_FileSystemNameBuffer, lul_FileSystemNameSize)
if lb_rtn = true then
MessageBox("提示","函数调用成功!
")
else
MessageBox("提示","函数调用失败!
")
end if
sle_1.text = String(lul_VolumeSerialNumber) // 得到硬盘序列号
/********************* 结束 *************************/
如果学习探讨对PB软件的序列号加密办法---“路漫漫,其修远兮”。
简单概括如下:
如果自己搞加密,那只有公开的算法(RSA、ECC等)才是可靠算法的,但算法本身并不反跟踪与破解,它只解决对象安全问题。
在共享软件安全保护上,唯有将入口安全和对象安全结合起来,才是稳妥可行的软件加密保护方案。
目前具体加密工具产品有:
比泰科技()的《软件防盗版战士》。
能防止跟踪破解。
它可以对PB编译的EXE程序加密,控制软件的发行。
避免技术破解及最终用户盗版。
适合数字化软件发行。
可从google查"软件防盗版战士",或从下载。
现介绍它的序列号版:
这是一个软件加密及数字化发行工具,加密后:
1、软件安全在不同电脑上,显示不同的序列号。
序列号分三段,总在30位以内的,形如:
3393975694 - 3387027627 - 1719891665 。
它们分别对应于一个30位以内的注册码。
2、对于同一台电脑,若因为客户电脑格式化等原因多次安装同一软件,则安装后所显示的最后10位序列号是不会变的(前面20位可能会变),您可以知道因此识别你的软件老客户,而不被骗。
3、对于不同的软件,即使安装在同一电脑上,它们的序列号不会有相同之处。
从脱机考勤机终端下载所有原始考勤记录,也可选择之下载新纪录;
可下载原始管理数据;
可下载指纹登记数据,也可以将指纹登记数据写入到脱机考勤机中;
可对考勤机进行控制,
如:
修改设置信息、关闭考勤机电源、设置时间等。
生物识别:
面部识别/虹膜识别/声音识别/指纹识别四大识别模式的技术
人类指纹对每一个人来说都是不同的,你可以把它看作识别特定的某个人的生理物理特征,最著名的就是犯罪嫌疑人的识别(AFIS)系统,但是随着算法的发展,门禁,计算机安全,网络安全,考勤,IC卡,PDA的应用等诸多方向都开始使用指纹识别技术。
指纹身份识别是目前最安全、最可靠的身份鉴定方法,已经广泛的应用在了公安,保险,医疗等领域,是具有法律权威的验证手段,也是目前技术最成熟,实现最简单的方法。
已经被劳动和社会保障部所认可。
指纹身份管理系统
后台验证比对
1、少人值守或无人值守中的作用
通过TCP/IP和Ethernet,WEBSERVER可以稳定可靠地应用到现场,指纹机中存储的数据可以通过网络远程进行实时查看和操纵,无须本人或专人亲自到现场操作,数据的收集,上载和系统的升级也可以通过浏览器来完成,无须借助任何软件和工具,
2、与中控系列家族软件的互连互通
WEBSERVER平台可以无缝与中控现有的系列家族软件,互连互通,相互兼容搭配,使得可以以更加灵活的方式来满足客户的需求
3、更稳定,快速的远程数据通信模式
通过WEBSERVER,数据可以被稳定和快速的下载到本地系统中,应用浏览器可以在较短的时间内下载指纹机中的全部数据,并且不用担心数据的可靠性。
4、更加灵活,易用的数据管理和资源共享模式
通过WEBSERVER平台上构键的应用程序,管理数据将变的更加易用和灵活。
5、可以轻松与网络OA,CRM系统互连或集成,实现完全的基于网络的人力资源管理解决方案
iClock系列机器的使用
、、
自动校准时间:
某一个网络内使用多台指纹机,而且要保证每台指纹机的时间都统一,如果一台一台的校对时间,工作量太大。
可以把某台机器或网络中的某台PC机当作时间服务器,在需要校准时间的机器中将自动校准时间选项设置为时间服务器的IP,其他机器会自动连接服务器进行时间校准工作。
只需要保证所有机器可以访问服务器。
短消息
在某些型号的机器上我们提供了定时定人发送对公对私短消息功能。
我们只需要在后台软件上进行设置,然后上传到指纹机中,对公的短消息在启动考勤机就可以看到,而且会一直出现,对私的短消息在用户验证指纹之后就会提示短消息。
从而减轻人事的工作量,大大提高工作效率。
针对某一个人发送消息,如一个员工10月20日生日,我们可以在后台软件上设置10月20日对他发出一个短消息“祝你生日快乐”,上传到机器中,该员工在那天进行指纹验证后,屏幕上就会显示此消息。
针对多个人发送消息,如6月19日需要开全公司的会议,我们在后台软件设置好之后上传到机器上,等到这一天的时候,屏幕上就会一直显示“在XX会议室举行XX会议,请大家于XX点参加”(当然这样的信息您可以根据自己的需要修改)。
短消息功能设置:
在考勤软件中将短消息设置好,然后上传到指纹机中即可。
指纹机支持两种方式导入,一是软件连接指纹机直接导入,二是从U盘导入。
具体操作如下:
1.在考勤软件“外接程序”—“短消息管理”处设置好短消息,连接指纹机,将短消息上传到指纹机中。
2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PowerBuilder 操作 BLOB 数据 技巧