問題:
如何將文件保存在OLE字段裡(OLE寫入/讀出)?
回答:
注意:以下代碼是將文件以二進制存儲在OLE字段中,與手動(右鍵單擊OLE字段,選"插入對象")將文件嵌入到OLE字段中是不同的。以二進制方法存儲文件無法直接在字段中編輯,必須讀出存為文件才能編輯,編輯完成後再寫入到OLE字段中。
如何將文件保存在OLE字段裡(OLE寫入/讀出)?
OLE文件讀入和讀出
支持的類型使所有文件,當然,你在讀入數據的時候,最好做一個字段保存文件的類型,在保存文件的時候,就可以根據類型選擇要保存的類型了。
Option Compare Database
Option Explicit
Public Function GetFromFile(strTable As String, strFIEld As String, strFilter As String, objFileName As String) As Boolean
'============================================================
' 過程函數名: CommModule.GetFromFile 類型:Function
' 參數:
' strTable (String) :准備保存圖形數據的表名稱
' strFIEld (String) :准備保存圖形數據的字段名稱
' strFilter (String) :打開表的過濾字符串,用於定位並確保被打開的表的數據的唯一性
' objFileName (String) :准備輸入到表裡邊的圖象文件名稱
' 返回:如果保存成功,返回True,如果失敗,返回False
'-------------------------------------------------------------
' 說明:把圖象文件的數據保存到表裡邊
'-------------------------------------------------------------
' 修訂歷史:
'=============================================================
Dim recset As ADODB.Recordset, FileData() As Byte, FileNo As Long, FileSize As Long, strSQL As String
strSQL = "Select " & strFIEld & " From " & strTable & " Where " & strFilter & ";"
Set recset = New ADODB.Recordset
recset.Open strSQL, CurrentProject.Connection, adOpenDynamic, adLockOptimistic
GetFromFile = True
If recset(strFIEld).Type <> DB_OLE Or Not IsFileName(objFileName) Then
GetFromFile = False '如果字段不是OLE字段,或者文件不存在,返回錯誤
GoTo EndGetFromFile
End If
If recset.EOF Then '如果記錄不存在,返回錯誤
GetFromFile = False
GoTo EndGetFromFile
End If
FileSize = GetFileSize(objFileName) '如果被打開的文件大小為零,返回錯誤
If FileSize <= 0 Then
GetFromFile = False
GoTo EndGetFromFile
End If
ReDim FileData(FileSize) '重新初始化數組
FileNo = FreeFile '獲取一個空閒的文件號
Open objFileName For Binary As #FileNo '打開文件
Get #FileNo, , FileData() '讀取文件內容到數組
Close #FileNo '關閉文件
recset(strFIEld).value = FileData() '保存數據
recset.Update '更新數據
Erase FileData '釋放內存
EndGetFromfile:
recset.Close '關閉RecordSet
Set recset = Nothing '釋放內存
End Function
Public Function SaveToFile(strTable As String, strFIEld As String, strFilter As String, strFileName As String) As Boolean
'============================================================
' 過程函數名: CommModule.SaveToFile 類型:Function
' 參數:
' strTable (String) :保存圖形數據的表名稱
' strFIEld (String) :保存圖形數據的字段名稱
' strFilter (String) :打開表的過濾字符串,用於定位並確保被打開的表的紀錄的唯一性
' strFileName (String) :准備保存的圖象的文件名稱
' 返回:如果保存成功,返回True,如果失敗,返回False
'-------------------------------------------------------------
' 說明:把由GetFromFile函數保存到表中OLE字段的數據還原到文件
'-------------------------------------------------------------
' 修訂歷史:
'=============================================================
Dim recset As ADODB.Recordset, FileData() As Byte, FileNo As Long, FileSize As Long, strSQL As String
strSQL = "Select " & strFIEld & " From " & strTable & " Where " & strFilter & ";"
Set recset = New ADODB.Recordset
recset.Open strSQL, CurrentProject.Connection, adOpenDynamic, adLockOptimistic
SaveToFile = True
If recset(strFIEld).Type <> DB_OLE Then
SaveToFile = False '如果字段不是OLE字段,返回錯誤
GoTo EndSaveToFile
End If
If recset.EOF Then '如果記錄不存在,返回錯誤
SaveToFile = False
GoTo EndSaveToFile
End If
FileNo = FreeFile
Open strFileName For Binary As #FileNo
ReDim FileData(recset(strFIEld).ActualSize) '重新初始化數組
FileData() = recset(strField).GetChunk(recset(strFIEld).ActualSize) '把OLE字段的內容保存到數組
Put #FileNo, , FileData() '把數組內容保存到文件
Close #FileNo
Erase FileData
EndSaveTofile:
recset.Close
Set recset = Nothing
End Function