请教在EXCELVBA中怎样用二进制把文件存入SQL的image字段、怎样把文件读出存入磁盘。
最好有把EXCEL文件存入SQL的image字段和打开SQL的image字段中的EXCEL文件的例子。
在程序开发提问了很久,没有解决。Access 与 SQL Server 的应用与开发 中的版主们,高手们
应该有解决办法吧?
网上的类似方法,修改后没有调试成功。
Private Const BLOCKSIZE = 4096 '每次读写块的大小
'将图片保存到数据库中
Public Function SavePicToDB(ByRef ADOFeild As ADODB.Field, PicFullName As String) As Boolean
Dim SourceFile As Long '定义读取图片时使用的文件号
Dim FileLength As Long '标识文件长度
Dim NumBlocks As Long '文件定义的块数量
Dim bytDataBlocks() As Byte '定义数据块数组
Dim LeftOver As Long '文件被分块后剩余的字节数
Dim i As Long '定义循环中使用的变量
On Error GoTo ErrHandle
'-----------------------------------------------------------------
'获取一个尚未使用的文件号
'-----------------------------------------------------------------
SourceFile = FreeFile
'-----------------------------------------------------------------
'打开以二进制的方式图片文件
'-----------------------------------------------------------------
Open PicFullName For Binary Access Read As #SourceFile
'-----------------------------------------------------------------
'获取打开的图片文件的长度(字节)
'-----------------------------------------------------------------
FileLength = LOF(SourceFile)
'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
'判断文件是否存在,0---不存在或无效;其他---存在
'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
If FileLength = 0 Then '不存在...
Close #SourceFile
SavePicToDB = False
Else
'-------------------------------------------------------------
'对文件按预定的块的大小进行分割
'-------------------------------------------------------------
NumBlocks = FileLength \ BLOCKSIZE '文件分割的块的数量
LeftOver = FileLength Mod BLOCKSIZE '文件分割后剩余的
'-------------------------------------------------------------
'初始化字段中的内容---清空当前记录中本字段的内容
'-------------------------------------------------------------
ADOFeild.value = Null
'-------------------------------------------------------------
'重新定义数据块的大小
'-------------------------------------------------------------
ReDim bytDataBlocks(BLOCKSIZE)
'-------------------------------------------------------------
'将图片各块的内容写入数据库相应字段
'-------------------------------------------------------------
For i = 1 To NumBlocks
Get #SourceFile, , bytDataBlocks()
ADOFeild.AppendChunk bytDataBlocks()
Next
If LeftOver > 0 Then
'-------------------------------------------------------------
'重新定义数据块的大小
'-------------------------------------------------------------
ReDim bytDataBlocks(LeftOver)
'-------------------------------------------------------------
'将图片剩余字节的内容写入数据库相应字段
'-------------------------------------------------------------
Get #SourceFile, , bytDataBlocks()
ADOFeild.AppendChunk bytDataBlocks()
End If
Close #SourceFile
End If
SavePicToDB = True
Exit Function
ErrHandle:
Close #SourceFile
SavePicToDB = False
End Function
'从数据库中读取图片
Public Function GetPicFromDB(ByRef ADOFeild As ADODB.Field, PicFullName As String) As Boolean
Dim SourceFile As Long '定义读取图片时使用的文件号
Dim FileLength As Long '标识文件长度
Dim NumBlocks As Long '文件定义的块数量
Dim bytDataBlocks() As Byte '定义数据块数组
Dim LeftOver As Long '文件被分块后剩余的字节数
Dim i As Long '定义循环中使用的变量
On Error GoTo ErrHandle
If IsNull(ADOFeild) Then
GetPicFromDB = False
Exit Function
End If
'-----------------------------------------------------------------
'获取数据库中存贮的图片的长度(字节)
'-----------------------------------------------------------------
FileLength = LenB(ADOFeild)
'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
'判断文件是否存在,0---不存在或无效;其他---存在
'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
If FileLength = 0 Then '不存在...
GetPicFromDB = False
Else
'-------------------------------------------------------------
'对文件按预定的块的大小进行分割
'-------------------------------------------------------------
NumBlocks = FileLength \ BLOCKSIZE '文件分割的块的数量
LeftOver = FileLength Mod BLOCKSIZE '文件分割后剩余的
'-------------------------------------------------------------
'获取一个尚未使用的文件号
'-------------------------------------------------------------
SourceFile = FreeFile
'-------------------------------------------------------------
'打开以二进制的方式图片文件(读写模式)
'-------------------------------------------------------------
Open PicFullName For Binary Access Write As #SourceFile
'-------------------------------------------------------------
'将图片从数据库相应字段中读出写入文件中
'-------------------------------------------------------------
For i = 1 To NumBlocks
bytDataBlocks() = ADOFeild.GetChunk(BLOCKSIZE)
Put #SourceFile, , bytDataBlocks()
Next
If LeftOver > 0 Then
'---------------------------------------------------------
'将图片剩余字节的内容写入数据库相应字段
'---------------------------------------------------------
bytDataBlocks() = ADOFeild.GetChunk(LeftOver)
Put #SourceFile, , bytDataBlocks()
End If
Close #SourceFile
End If
GetPicFromDB = True
Exit Function
ErrHandle:
Close #SourceFile
GetPicFromDB = False
End Function
|