?? 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 + -