📄 42847.htm
字号:
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><P>{table_name.dest_column_name dest_text_ptr}<BR>{NULL|insert_offset}{ NULL | delete_length}<BR>[WITH LOG][ inserted_data| <BR>{table_name.src_column_name src_text_ptr}</P></PRE></TD></TR></TBODY></TABLE></P>
<P>table_name.dest_column_name 为要修改的text, ntext, 或 image字段;dest_text_ptr为指向其的指针;insert_offset为偏移量,对于text和image为从第几开始字节开始写,对于ntext为从第几个字符(双字节)开始写;delete_length为从insert_offset开始删除delete_length长度的字节(符),为0时不删除,为NULL时为删除从insert_offset开始到结束的所有数据。要插入的数据为 inserted_data为,也可是表table_name的src_column_name字段中指针 src_text_ptr所指数据。 </P>
<P>例:</P>
<P>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><P>DECLARE @ptrval binary(16)<BR> SELECT @ptrval = TEXTPTR(img_ct) FROM zy_ct WHERE id_ct = 20010101001<BR> UPDATETEXT zy_ct.img_ct @ptrval 16 0x54345 </P></PRE></TD></TR></TBODY></TABLE></P>
<P>可以看出,这三个函数的使用比较复杂,虽然可以通过生成存贮过程来调用执行,但有一个缺陷是在读取数据时,READTEXT函数读取的数据无法直接传递回前端应用程序。 </P>
<P><STRONG>3、VB 6.0中图像数据的存取</STRONG> </P>
<P>VB 6.0 的ADO Field 对象提供了GetChunk 方法和AppendChunk 方法来存取BLOB数据,这两个函数实质是通过API调用WRITETEXT 、READTEXT和UPDATETEXT这三个函数,简化了调用的方法。 </P>
<P>(1)GetChunk 和AppendChunk方法介绍 </P>
<P>GetChunk 方法检索其部分或全部长二进制或字符数据。GetChunk 调用返回的数据将赋给“变量”。如果 Size 大于剩余的数据,则 GetChunk 仅返回剩余的数据而无需用空白填充“变量”。如果字段为空,则 GetChunk 方法返回 Null。每个后续的 GetChunk 调用将检索从前一次 GetChunk 调用停止处开始的数据。但是,如果从一个字段检索数据然后在当前记录中设置或读取另一个字段的值,ADO 将认为已从第一个字段中检索出数据。如果在第一个字段上再次调用 GetChunk 方法,ADO 将把调用解释为新的 GetChunk 操作并从记录的起始处开始读取。Field 对象的第一个 AppendChunk 调用将数据写入字段,覆盖所有现有的数据,随后的 AppendChunk 调用则添加到现有数据。 </P>
<P>由于系统资源总是有限的,如果一次读(存)取大量数据,可能会引起服务器、客户机死机或是服务器的性能大大下降,因此使用这两个函数时,要将图像数据进行分段读写。 </P>
<P>#p#</P>
<P>(2)程序实现 </P>
<P>程序一:写数据函数 </P>
<P>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><P>Public Function AppendBlobFromFile<BR>(blobColumn As ADODB.Field, ByVal FileName) As Boolean<BR>Dim FileNumber As Integer '文件号<BR> Dim DataLen As Long '文件长度<BR>Dim Chunks As Long '数据块数<BR>Dim ChunkAry() As Byte '数据块数组<BR>Dim ChunkSize As Long '数据块大小<BR>Dim Fragment As Long '零碎数据大小<BR>Dim lngI As Long '计数器<BR> <BR>On Error GoTo ErrorHandle<BR>AppendBlobFromFile = False<BR>ChunkSize = 2048 '限制每次读取的块大小为 2K<BR> <BR>FileNumber = FreeFile '产生随机的文件号<BR>Open FileName For Binary Access Read As FileNumber '打开图像文件<BR>DataLen = LOF(FileNumber) '获得文件长度<BR> If IsNull(blobColumn) Then Exit Function<BR> <BR>If DataLen = 0 Then '文件长度为0<BR>Close FileNumber<BR> AppendBlobFromFile = True<BR> Exit Function<BR>End If<BR> <BR>Chunks = DataLen \ ChunkSize '数据块的个数<BR>Fragment = DataLen Mod ChunkSize<BR>If Fragment > 0 Then '先写零碎数据<BR>ReDim ChunkAry(Fragment - 1)<BR> Get FileNumber, , ChunkAry() '读出文件<BR> blobColumn.AppendChunk ChunkAry '调用AppendChunk函数写数据<BR>End If<BR> <BR>ReDim ChunkAry(ChunkSize - 1) '为数据块开辟空间<BR>For lngI = 1 To Chunks '循环读出所有数据块<BR> Get FileNumber, , ChunkAry() '读出一块数据<BR> blobColumn.AppendChunk ChunkAry '在数据库中增加数据块<BR>Next lngI<BR> <BR>Close FileNumber '关闭文件<BR>AppendBlobFromFile = True<BR>Exit Function<BR>ErrorHandle:<BR>AppendBlobFromFile = False<BR>MsgBox Err.Description, vbCritical, "写图像数据出错!"<BR>End Function </P></PRE></TD></TR></TBODY></TABLE></P>
<P>程序二:读数据函数 </P>
<P>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code bgColor=#e6e6e6><PRE><P>Public Function ReadbolbToFile<BR>(blobColumn As ADODB.Field, ByVal FileName) As Boolean<BR>Dim FileNumber As Integer '文件号<BR>Dim DataLen As Long '文件长度<BR>Dim Chunks As Long '数据块数<BR>Dim ChunkAry() As Byte '数据块数组<BR>Dim ChunkSize As Long '数据块大小<BR>Dim Fragment As Long '零碎数据大小<BR>Dim lngI As Long '计数器<BR> <BR> On Error GoTo ErrorHandle<BR> ReadbolbToFile= False<BR> ChunkSize = 2048 '定义块大小为 2K<BR> If IsNull(blobColumn) Then Exit Function<BR> <BR> DataLen = blobColumn.ActualSize '获得图像大小<BR> If DataLen < 8 Then Exit Function '图像大小小于8字节时认为不是图像信息<BR> FileNumber = FreeFile '产生随机的文件号<BR> Open FileName For Binary Access Write As FileNumber '打开存放图像数据文件<BR> Chunks = DataLen \ ChunkSize '数据块数<BR> Fragment = DataLen Mod ChunkSize '零碎数据<BR> If Fragment > 0 Then '有零碎数据,则先读该数据<BR> ReDim ChunkAry(Fragment - 1)<BR> ChunkAry = blobColumn.GetChunk(Fragment)<BR> Put FileNumber, , ChunkAry '写入文件<BR> End If<BR> <BR> ReDim ChunkAry(ChunkSize - 1) '为数据块重新开辟空间<BR> For lngI = 1 To Chunks '&shy;循环读出所有块<BR> ChunkAry = blobColumn.GetChunk(ChunkSize) '在数据库中连续读数据块<BR> Put FileNumber, , ChunkAry() '将数据块写入文件中<BR> Next lngI<BR> Close FileNumber '关闭文件<BR> ReadbolbToFile= True<BR> Exit Function<BR>ErrorHandle:<BR> ReadbolbToFile= False<BR> MsgBox Err.Description, vbCritical, "读图像数据出错!"<BR>End Function </P></PRE></TD></TR></TBODY></TABLE></P>
<P>当BLOB类型的字段为空时,调用AppendChunk或 GetChunk函数将出错。此时如果想给该字段插入图像数据,应该先使用 Update语句给该字段赋初值如0x0,以便数据库系统为该字段分配一个页面地址来存放BLOB数据。 </P>
<P><STRONG>4、总结</STRONG> </P>
<P>Microsoft SQL Server为保存大二进制数据提供了存储平台,Visual Basic 6.0为存取这种数据提供了灵活的接口。本文介绍的用VB接口存取 MIS SQL Server中大二进制数据的方法,不但适用于图像文件,同样适用于其它类型的文件。该方法应用于医院管理系统的图像存取中,在存取速度、对系统的性能影响等方面都取了满意的效果。</P>
<DIV align=right>【责任编辑:<A class=ln href="mailto:sunsj@51cto.com">火凤凰</A> TEL:(010)68476606-8007】</DIV></td> </tr> <tr> <td class="d_font4"> </td> </tr> </table>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -