四、存储图像数据的方法举例
4.1 建立具有BLOB字段的ORACLE数据库
按照如下步骤来完成各个操作:
(1)创建表空间:
(2)创建表:CREATE TABALEESPACE VIDO_STORE DATAFILE'C:DATABASEtest.dbf' SIZE 200M
create table part( part_id NUMBER, 主建 part_name VARCHAR2(20), part_image BLOB, part_desc CLOB part_colla BFILE );
这个数据库第一列存储一个码,第二列存储名称,另外三列存储lob型数据。
(3)创建新的用户:如user1/pass1,赋予connect,resource权限。
(4)创建逻辑目录:
bfile类型有着特殊性,跟clob,blob不同。实际的数据文件存储在的外面:所以有两个特点:1.没有事务性控制 2.bfile是只读的,不能用dbms_lob或oracl8 oci进行修改。 为了访问外部文件,服务器需要知道文件在操作系统中的位置。下面我们建立一个目录:操作系统
create DIRECTORY utils AS '/home/utils';
utils表示目录逻辑名,'/home/utils'是实际目录。
总结:
表空间 VIDO_STORE
Oracle service_names: oradb
Oracle用户名: user1
户名密码: pass1
测试表名: test
tnsnames: oradb
逻辑目录: utils
4.2利用Visual Basic 6.0来处理大对象
在vb中处理大对象,一般可以用OO4O(oracle objects for ole)来处理。这里介绍一种不用0040处理大对象blob的方法。
下面这段程序可以将一个图像数据保存到数据库中,并可以将其从数据库读出。
程序中需要两个commandbutton
cmd1 名称 cmdsave caption 保存
cmd2 名称 cmdread caption 读取
向数据库中写入数据:
Dim OraSession As OraSession Dim OraDatabase As OraDatabase Dim OraDynaset As OraDynaset Dim PartDesc As OraClob Dim buffer As String Dim chunksize As Long Dim amount_written As Long '建立OraSession对象. Set OraSession = CreateObject("OracleInProcServer.XOraSession") '打开数据库连接建立OraDatabase 对象. Set OraDatabase = OraSession.OpenDatabase("ExampleDb", "scott/tiger", 0&) '建立 OraDynaset 对象 Set OraDynaset = OraDatabase.CreateDynaset("select * from part", 0&) Set PartDesc = OraDynaset.Fields("part_desc").Value chunksize = 32000
重新调整buffer大小
buffer = String$(chunksize, 32) FNum = FreeFile '打开文件 Open "partdesc.dat" For Binary As #FNum '设置offset和PollingAmount属性 '写入操作 PartDesc.offset = 1 PartDesc.PollingAmount = LOF(FNum) remainder = LOF(FNum) '锁定写入行 OraDynaset.Edit Get #FNum, , buffer '第一次写入操作 amount_written = PartDesc.Write(buffer, chunksize, ORALOB_FIRST_PIECE) While PartDesc.Status = ORALOB_NEED_DATA remainder = remainder - chunksize If remainder < chunksize Then piecetype = ORALOB_LAST_PIECE chunksize = remainder Else piecetype = ORALOB_NEXT_PIECE End If Get #FNum, , buffer amount_written = PartDesc.Write(buffer, chunksize, piecetype) Wend Close FNum '更新提交 OraDynaset.Update 从数据库中读取数据: Dim OraSession As OraSession Dim OraDatabase As OraDatabase Dim OraDynaset As OraDynaset Dim PartImage As OraBlob Dim chunksize As Long Dim AmountRead As Long Dim buffer As Variant Dim buf() As Byte '建立 OraSession对象 Set OraSession = CreateObject("OracleInProcServer.XOraSession") '建立OraDatabase对象 Set OraDatabase = OraSession.OpenDatabase("ExampleDb","scott/tiger", 0&) '建立OraDynaset对象 Set OraDynaset = OraDatabase.CreateDynaset("select * from part", 0&) '从动态集中获得OraBlob Set PartImage = OraDynaset.Fields("part_image").Value '设置Offset和PollingAmount属性 PartImage.offset = 1 PartImage.PollingAmount = PartImage.Size chunksize = 50000 '获得自由文件号 FNum = FreeFile '打开文件 Open "image.dat" For Binary As #FNum '第一次读 AmountRead = PartImage.Read(buffer, chunksize) buf = buffer Put #FNum, , buf ' 检查属性 While PartImage.Status = ORALOB_NEED_DATA AmountRead = PartImage.Read(buffer, chunksize) buf = buffer Put #FNum, , buf Wend Close FNum