📄 052.htm
字号:
face="Arial">BLOB</font><font face="宋体" lang="ZH-CN">字段。</p>
<p> 最后如果方法传入的</font><font face="Arial">Mode</font><font
face="宋体" lang="ZH-CN">参数值为</font><font face="Arial">bmWrite</font><font
face="宋体" lang="ZH-CN">,就调用</font><font face="Arial">Truncate</font><font
face="宋体" lang="ZH-CN">将当前位置指针以后的</p>
<p>数据删除。</p>
<p> 分析这段源程序不难知道:</p>
<p> ●</font><font face="Arial"> </font><font face="宋体" lang="ZH-CN">读写</font><font
face="Arial">BLOB</font><font face="宋体" lang="ZH-CN">字段,不允许</font><font
face="Arial">BLOB</font><font face="宋体" lang="ZH-CN">字段所在</font><font
face="Arial">DataSet</font><font face="宋体" lang="ZH-CN">部件有</font><font
face="Arial">Filter</font><font face="宋体" lang="ZH-CN">,否则产生异常事件</p>
<p> ●</font><font face="Arial"> </font><font face="宋体" lang="ZH-CN">要读写</font><font
face="Arial">BLOB</font><font face="宋体" lang="ZH-CN">字段,必须将</font><font
face="Arial">DataSet</font><font face="宋体" lang="ZH-CN">设为编辑或插入状态</font><font
face="Arial"></p>
<p></font><font face="宋体" lang="ZH-CN"> </font><font face="Arial"> </font><font
face="宋体" lang="ZH-CN">●</font><font face="Arial"> </font><font face="宋体"
lang="ZH-CN">如果</font><font face="Arial">BLOB</font><font face="宋体" lang="ZH-CN">字段中的数据作了修改,则在创建</font><font
face="Arial">BLOB </font><font face="宋体" lang="ZH-CN">流时,不再重新调用</font><font
face="Arial">DBiOpenBlob</font><font face="宋体" lang="ZH-CN">函数,而只是简单地将</font><font
face="Arial">FOpened</font><font face="宋体" lang="ZH-CN">置为</font><font
face="Arial">True</font><font face="宋体" lang="ZH-CN">,这样可以用多个</font><font
face="Arial">BLOB </font><font face="宋体" lang="ZH-CN">流对同一个</font><font
face="Arial">BLOB</font><font face="宋体" lang="ZH-CN">字段读写</p>
<p> </p>
<p> </font><font face="Arial">Destroy</font><font face="宋体" lang="ZH-CN">方法释放</font><font
face="Arial">BLOB</font><font face="宋体" lang="ZH-CN">字段和为</font><font
face="Arial">FBuffer</font><font face="宋体" lang="ZH-CN">分配的缓冲区,其实现如下:</p>
<p> </p>
<p></font><font face="Arial">destructor TBlobStream.Destroy;</p>
<p>begin</p>
<p>if FOpened then</p>
<p>begin</p>
<p>if FModified then FField.FModified := True;</p>
<p>if not FField.FModified then</p>
<p>DbiFreeBlob(FDataSet.Handle, FRecord, FFieldNo);</p>
<p>end;</p>
<p>if FBuffer <> nil then FreeMem(FBuffer, FDataSet.RecordSize);</p>
<p>if FModified then</p>
<p>try</p>
<p>FField.DataChanged;</p>
<p>except</p>
<p>Application.HandleException(Self);</p>
<p>end;</p>
<p>end;</p>
<p> </font><font face="宋体" lang="ZH-CN"></p>
<p> 如果</font><font face="Arial">BLOB</font><font face="宋体" lang="ZH-CN">流中的数据作了修改,就将</font><font
face="Arial">FField</font><font face="宋体" lang="ZH-CN">的</font><font face="Arial">FModified</font><font
face="宋体" lang="ZH-CN">置为</font><font face="Arial">True</font><font face="宋体"
lang="ZH-CN">;如果</font><font face="Arial">FField</font><font face="宋体"
lang="ZH-CN">的</font><font face="Arial">Modified</font><font face="宋体" lang="ZH-CN">为</font><font
face="Arial">False</font><font face="宋体" lang="ZH-CN">就释放</font><font
face="Arial">BLOB</font><font face="宋体" lang="ZH-CN">字段,如果</font><font
face="Arial">FBuffer</font><font face="宋体" lang="ZH-CN">不为空,则释放临时内存。最后根据</font><font
face="Arial">FModified</font><font face="宋体" lang="ZH-CN">的值来决定是否启动</font><font
face="Arial">FField</font><font face="宋体" lang="ZH-CN">的事件处理过程</font><font
face="Arial">DataChanged</font><font face="宋体" lang="ZH-CN">。</p>
<p> 不难看出,如果</font><font face="Arial">BLOB</font><font face="宋体"
lang="ZH-CN">字段作了修改就不释放</font><font face="Arial">BLOB</font><font
face="宋体" lang="ZH-CN">字段,并且对</font><font face="Arial">BLOB </font><font
face="宋体" lang="ZH-CN">字段的修改只有到</font><font face="Arial">Destroy</font><font
face="宋体" lang="ZH-CN">时才提交,这是因为读写</font><font face="Arial">BLOB</font><font
face="宋体" lang="ZH-CN">字段时都避开了</font><font face="Arial">FField</font><font
face="宋体" lang="ZH-CN">,而直接调用</font><font face="Arial">BDE API</font><font
face="宋体" lang="ZH-CN">函数。这一点是在应用</font><font face="Arial">BDE API</font><font
face="宋体" lang="ZH-CN">编程中很重要,即一定要修改相应数据库部件的状态。</p>
<p> </font><font face="Arial">2. Read</font><font face="宋体" lang="ZH-CN">和</font><font
face="Arial">Write</font><font face="宋体" lang="ZH-CN">方法的实现</p>
<p> </font><font face="Arial">Read</font><font face="宋体" lang="ZH-CN">和</font><font
face="Arial">Write</font><font face="宋体" lang="ZH-CN">方法都调用</font><font
face="Arial">BDE API</font><font face="宋体" lang="ZH-CN">函数完成数据库</font><font
face="Arial">BLOB</font><font face="宋体" lang="ZH-CN">字段的读写,其实现如下:</p>
<p> </p>
<p></font><font face="Arial">function TBlobStream.Read(var Buffer; Count: Longint):
Longint;</p>
<p>var</p>
<p>Status: DBIResult;</p>
<p>begin</p>
<p>Result := 0;</p>
<p>if FOpened then</p>
<p>begin</p>
<p>Status := DbiGetBlob(FDataSet.Handle, FRecord, FFieldNo, FPosition,</p>
<p>Count, @Buffer, Result);</p>
<p>case Status of</p>
<p>DBIERR_NONE, DBIERR_ENDOFBLOB:</p>
<p>begin</font><font face="宋体" lang="ZH-CN"></p>
<p></font><font face="Arial">if FField.FTransliterate then</font><font face="宋体"
lang="ZH-CN"></p>
<p></font><font face="Arial">NativeToAnsiBuf(FDataSet.Locale, @Buffer, @Buffer, Result);</p>
<p>Inc(FPosition, Result);</p>
<p>end;</p>
<p>DBIERR_INVALIDBLOBOFFSET:</p>
<p>{Nothing};</p>
<p>else</p>
<p>DbiError(Status);</p>
<p>end;</p>
<p>end;</p>
<p>end;</p>
<p> </font><font face="宋体" lang="ZH-CN"></p>
<p> </font><font face="Arial">Read</font><font face="宋体" lang="ZH-CN">方法使用了</font><font
face="Arial">BDE API</font><font face="宋体" lang="ZH-CN">的</font><font face="Arial">DbiGetBlob</font><font
face="宋体" lang="ZH-CN">函数从</font><font face="Arial">FDataSet</font><font
face="宋体" lang="ZH-CN">中读取数据,在本函数中,各参数的含义是这样的:</font><font
face="Arial">FDataSet.Handle</font><font face="宋体" lang="ZH-CN">代表</font><font
face="Arial">DataSet</font><font face="宋体" lang="ZH-CN">的</font><font face="Arial">BDE</font><font
face="宋体" lang="ZH-CN">句柄,</font><font face="Arial">FReacord</font><font
face="宋体" lang="ZH-CN">表示</font><font face="Arial">BLOB</font><font face="宋体"
lang="ZH-CN">字段所在记录,</font><font face="Arial">FFieldNo</font><font
face="宋体" lang="ZH-CN">表示</font><font face="Arial">BLOB</font><font face="宋体"
lang="ZH-CN">字段号,</font><font face="Arial">FPosition</font><font face="宋体"
lang="ZH-CN">表示要读的的数据的起始位置,</font><font face="Arial">Count</font><font
face="宋体" lang="ZH-CN">表示要读的字节数,</font><font face="Arial">Buffer</font><font
face="宋体" lang="ZH-CN">是读出数据所占的内存,</font><font face="Arial">Result</font><font
face="宋体" lang="ZH-CN">是实际读出的字节数。该</font><font face="Arial">BDE</font><font
face="宋体" lang="ZH-CN">函数返回函数调用的错误状态信息。</p>
<p> </font><font face="Arial">Read</font><font face="宋体" lang="ZH-CN">方法还调用了</font><font
face="Arial">NativeToAnsiBuf</font><font face="宋体" lang="ZH-CN">进行字符集的转换。</p>
<p> </p>
<p></font><font face="Arial">function TBlobStream.Write(const Buffer; Count: Longint):
Longint;</p>
<p>var</p>
<p>Temp: Pointer;</p>
<p>begin</p>
<p>Result := 0;</p>
<p>if FOpened then</p>
<p>begin</p>
<p>if FField.FTransliterate then</p>
<p>begin</p>
<p>GetMem(Temp, Count);</p>
<p>try</p>
<p>AnsiToNativeBuf(FDataSet.Locale, @Buffer, Temp, Count);</p>
<p>Check(DbiPutBlob(FDataSet.Handle, FRecord, FFieldNo, FPosition,</p>
<p>Count, Temp));</p>
<p>finally</p>
<p>FreeMem(Temp, Count);</p>
<p>end;</p>
<p>end else</p>
<p>Check(DbiPutBlob(FDataSet.Handle, FRecord, FFieldNo, FPosition,</p>
<p>Count, @Buffer));</p>
<p>Inc(FPosition, Count);</p>
<p>Result := Count;</p>
<p>FModified := True;</p>
<p>end;</p>
<p>end;</p>
<p> </p>
<p>Write</font><font face="宋体" lang="ZH-CN">方法调用了</font><font face="Arial">BDE
API</font><font face="宋体" lang="ZH-CN">的</font><font face="Arial">DbiPutBlob</font><font
face="宋体" lang="ZH-CN">函数实现往数据库</font><font face="Arial">BLOB</font><font
face="宋体" lang="ZH-CN">字段存储数据。</font><font face="Arial"></p>
<p></font><font face="宋体" lang="ZH-CN">该函数的各参数含义如下:</p>
<p> </font><font face="Arial"></p>
<p></font><font face="宋体" lang="ZH-CN">表</font><font face="Arial">20.2 </font><font
face="宋体" lang="ZH-CN">调用函数</font><font face="Arial">DbiPutBlob</font><font
face="宋体" lang="ZH-CN">的各传入参数的含义</font><font face="Arial"></p>
<p></font><font face="宋体" lang="ZH-CN"> ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</p>
<p> </font><font face="Arial"> </font><font face="宋体" lang="ZH-CN"> 参数名 含义</font><font
face="Arial"></p>
<p></font><font face="宋体" lang="ZH-CN">──────────────────────────────</p>
<p> </font><font face="Arial"> FDataSetHandle </font><font face="宋体" lang="ZH-CN">写入的数据库的</font><font
face="Arial">BDE</font><font face="宋体" lang="ZH-CN">句柄</font><font face="Arial"></p>
<p></font><font face="宋体" lang="ZH-CN"> </font><font face="Arial"> FRecord </font><font
face="宋体" lang="ZH-CN">写入数据的</font><font face="Arial">BLOB</font><font
face="宋体" lang="ZH-CN">字段所在的记录</font><font face="Arial"></p>
<p>FFieldNo BLOB</font><font face="宋体" lang="ZH-CN">字段号</font><font face="Arial"></p>
<p></font><font face="宋体" lang="ZH-CN"> </font><font face="Arial"> FPosition </font><font
face="宋体" lang="ZH-CN">写入的起始位置</p>
<p> </font><font face="Arial"> Count </font><font face="宋体" lang="ZH-CN">写入的数据的字节数</font><font
face="Arial"></p>
<p></font><font face="宋体" lang="ZH-CN"> </font><font face="Arial"> Buffer </font><font
face="宋体" lang="ZH-CN">所写入的数据占有的内存地址</p>
<p> </font><font face="Arial"> </font><font face="宋体" lang="ZH-CN">━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</p>
<p> </p>
<p> 方法中还根据</font><font face="Arial">FField</font><font face="宋体"
lang="ZH-CN">和</font><font face="Arial">FTransliterate</font><font face="宋体"
lang="ZH-CN">的值判断是否进行相应的字符集转换,最后移动</font><font
face="Arial">BLOB</font><font face="宋体" lang="ZH-CN">流的位置指针,并将修改标志</font><font
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -