|
读取OLE字段的内容到文件中。
Public Function ReadbolbToFile0(blobColumn As ADODB.Field, ByVal FILENAME) As Boolean
Dim FileNumber As Integer '文件号
Dim DataLen As Long '文件长度
Dim Chunks As Long '数据块数
Dim ChunkAry() As Byte '数据块数组
Dim ChunkSize As Long '数据块大小
Dim Fragment As Long '零碎数据大小
Dim lngI As Long '计数器
On Error GoTo ErrorHandle
ReadbolbToFile0 = False
ChunkSize = 2048 '定义块大小为 2KB
If IsNull(blobColumn) Then Exit Function
DataLen = blobColumn.ActualSize '获得图像大小
If DataLen < 8 Then Exit Function '图像大小小于8 Byte时认为不是图像信息
FileNumber = FreeFile '产生随机的文件号
Open FILENAME For Binary Access Write As FileNumber '打开存放图像数据文件
Chunks = DataLen \ ChunkSize '数据块数
Fragment = DataLen Mod ChunkSize '零碎数据
If Fragment > 0 Then '有零碎数据,则先读该数据
ReDim ChunkAry(Fragment - 1)
ChunkAry = blobColumn.GetChunk(Fragment)
Put FileNumber, , ChunkAry '写入文件
End If
ReDim ChunkAry(ChunkSize - 1) '为数据块重新开辟空间
For lngI = 1 To Chunks '循环读出所有块
' If lngI = Chunks Then
' ChunkSize = 1974
' End If
ChunkAry = blobColumn.GetChunk(ChunkSize) '在数据库中连续读数据块
Put FileNumber, , ChunkAry() '将数据块写入文件中
Next lngI
Close FileNumber '关闭文件
ReadbolbToFile0 = True
Exit Function
ErrorHandle:
ReadbolbToFile0 = False
MsgBox Err.Description, vbCritical, "读图像数据出错!"
End Function
然后创建一个窗体来测试这个公共模块,窗体的代码如下。
Option Compare Database
Option Explicit
Private Sub cmdGetBmpFile_Click()
Dim rstTemp As New ADODB.Recordset
rstTemp.Open "select * from tblOleFile where FFileName='测试Bmp文件'", CurrentProject.Connection, adOpenDynamic, adLockOptimistic
ReadbolbToFile rstTemp("FFileOle"), "c:\测试Bmp文件.bmp"
rstTemp.Close
End Sub
Private Sub cmdGetExcelFile_Click()
Dim rstTemp As New ADODB.Recordset
rstTemp.Open "select * from tblOleFile where FFileName='测试Excel文件'", CurrentProject.Connection, adOpenDynamic, adLockOptimistic
ReadbolbToFile rstTemp("FFileOle"), "c:\测试Excel文件.xls"
rstTemp.Close
End Sub
Private Sub cmdGetWordFile_Click()
Dim rstTemp As New ADODB.Recordset
rstTemp.Open "select * from tblOleFile where FFileName='测试Word文件'", CurrentProject.Connection, adOpenDynamic, adLockOptimistic
ReadbolbToFile rstTemp("FFileOle"), "c:\测试Word文件.doc"
rstTemp.Close
End Sub
注意,这样读取出来的文件大小可能与原来文件大小会有一些差异,但文件打开后的内容是一致的,没有数据丢失的现象。
专家点评
上述方法虽然能正确读取文件的内容,但必须预先知道文件存储的格式,如果不知道文件写入到OLE字段的格式,那读取出来就无法以适当的文件扩展名保存该文件。不过,通过读取文件头中有关信息或许可知道文件的大致类型,这需要做进一步的深入研究。 |
|