MSDN中的例子,你先看看。我程序明天给你AppendChunk 和 GetChunk 方法范例 该范例使用 AppendChunk 和 GetChunk 方法用其他记录中的数据填写图像字段。Public Sub AppendChunkX() Dim cnn1 As ADODB.Connection Dim rstPubInfo As ADODB.Recordset Dim strCnn As String Dim strPubID As String Dim strPRInfo As String Dim lngOffset As Long Dim lngLogoSize As Long Dim varLogo As Variant Dim varChunk As Variant
导入按钮 Private Sub CmdImport_Click() Dim TmpRs As Recordset '临时记录集 Dim SiZe As Long '文件大小 Dim FileNo As Long '文件号 Dim FieldSize As Long '字段大小 Dim bit() As Byte Dim I As Long Dim TmpFileTitle As String Const MAX_FIELD_SIZE = 1073741824 '最大存储量为2G FileNo = FreeFile On Error Resume Next MBbook = Me![FootChild].Form.Book TmpDialog.Filename = "" TmpDialog.Filter = "(*.*)|*.*" TmpDialog.ShowOpen '判断打开对话框中是否选择了文件 If Dir(TmpDialog.Filename) = "" Or IsNull(TmpDialog.Filename) Or TmpDialog.Filename = "" Then Exit Sub Else Call Split(TmpDialog.Filename, "\", tmpfilename()) TmpFileTitle = tmpfilename(UBound(tmpfilename)) Open TmpDialog.Filename For Binary As FileNo SiZe = LOF(FileNo)
If Not (IsNull(Linktxt) Or Linktxt = "10") Then Set TmpRs = CurrentDb.OpenRecordset("SELECT TW_WD_NR.T_BT,TW_WD_NR.O_NR FROM TW_WD_NR WHERE (((TW_WD_NR.T_WDBH) ='" & [Forms]![FS_SCWDset_F]![Linktxt] & "'));", 2, dbSeeChanges) If TmpRs.Recordcount > 0 Then If SiZe > 0 Then With TmpRs .Edit For I = 0 To SiZe Step MAX_FIELD_SIZE FieldSize = IIf(SiZe - I < MAX_FIELD_SIZE, SiZe - I, MAX_FIELD_SIZE) ReDim bit(FieldSize - 1) Get FileNo, , bit .Fields("O_NR").Value = bit .Update Next End With End If Close FileNo With TmpRs .Edit .Fields("T_BT").Value = TmpFileTitle .Update .Close End With End If Else Dim Rs As Recordset Dim tmpsqlstr As String Set Rs = CurrentDb.OpenRecordset("SELECT TW_WD_NR.T_WDBH FROM TW_WD_NR WHERE (((TW_WD_NR.T_FLBH) ='" & [Forms]![FS_SCWDset_F]![HeadLink] & "'));", 2, dbSeeChanges) Set TmpRs = FootChild.Form.RecordsetClone If Rs.Recordcount < 1 Then With TmpRs .AddNew !T_WDBH = [Forms]![FS_SCWDset_F]![HeadLink] + "001" !T_WDDH = [Forms]![FS_SCWDset_F]![HeadLink] + "001" !T_FLBH = [Forms]![FS_SCWDset_F]![HeadLink] !T_ZJC = "NEW" !T_BT = TmpFileTitle If SiZe > 0 Then For I = 0 To SiZe Step MAX_FIELD_SIZE FieldSize = IIf(SiZe - I < MAX_FIELD_SIZE, SiZe - I, MAX_FIELD_SIZE) ReDim bit(FieldSize - 1) Get FileNo, , bit .Fields("O_NR").Value = bit .Update Next End If .Update End With Else With TmpRs .AddNew '---------------------------获得最大票号---------------------------- tmpsqlstr = "SELECT Max(TW_WD_NR.T_WDBH) FROM TW_WD_NR WHERE (((TW_WD_NR.T_FLBH)='" & [Forms]![FS_SCWDset_F]![HeadLink] & "'));" !T_WDBH = GetIDMax(tmpsqlstr) !T_WDDH = GetIDMax(tmpsqlstr) !T_FLBH = [Forms]![FS_SCWDset_F]![HeadLink] !T_ZJC = "NEW" !T_BT = TmpFileTitle If SiZe > 0 Then For I = 0 To SiZe Step MAX_FIELD_SIZE FieldSize = IIf(SiZe - I < MAX_FIELD_SIZE, SiZe - I, MAX_FIELD_SIZE) ReDim bit(FieldSize - 1) Get FileNo, , bit .Fields("O_NR").Value = bit .Update Next End If .Update End With End If End If End If Close FileNo Me![FootChild].Form.Requery Me![FootChild].Form.Book = MBbook
End Sub导出操作 Private Sub CmdExport_Click() Dim TmpRs As Recordset '临时记录集 Dim tmpsqlstr As String Dim FileNo As Long '文件号 Dim bit() As Byte '字节数组 Dim I As Long
Dim TmpFilter As String
FileNo = FreeFile 'Fu 2000-11-15 '为 以下的Sql添加一个条件 内容不能为空 tmpsqlstr = "SELECT TW_WD_NR.* FROM TW_WD_NR WHERE (((TW_WD_NR.O_NR) Is Not Null) AND ((TW_WD_NR.T_WDBH)='" & [Forms]![FS_SCWDset_F]![Linktxt] & "'));" Set TmpRs = CurrentDb.OpenRecordset(tmpsqlstr, 2, dbSeeChanges) If TmpRs.Recordcount > 0 Then
With TmpDialog .Filename = "" .Filter = "(*." & TmpFilter & ")|*." & TmpFilter .ShowSave End With
'将数据库中的文档内容存入指定文件中 If IsNull(TmpDialog.Filename) Or TmpDialog.Filename = "" Then Exit Sub Else Open TmpDialog.Filename For Binary As FileNo On Error GoTo 0
Set TmpRs = CurrentDb.OpenRecordset(tmpsqlstr, 2, dbSeeChanges) With TmpRs
Do Until .EOF bit = .Fields("O_NR").Value Put FileNo, , bit .MoveNext Loop End With Close FileNo End If Else msgbox "没有相应内容,所以无法导出!", 48, "系统提示" Exit Sub End If
End Sub导出显示 Private Sub CmdWD_Click() Dim TmpRs As Recordset '临时记录集 Dim tmpsqlstr As String Dim FileNo As Long '文件号 Dim bit() As Byte '字节数组 Dim I As Long Dim CurrentPath As String Dim TmpFile As String Dim Tmpstr As String
FileNo = FreeFile CurrentPath = curdbpath Tmpstr = CurrentPath & "TmpDir" TmpFile = "" On Error Resume Next If Dir(Tmpstr, vbDirectory) = "" Then MkDir Tmpstr End If tmpsqlstr = "SELECT TW_WD_NR.T_BT,TW_WD_NR.O_NR FROM TW_WD_NR WHERE (((TW_WD_NR.T_WDBH) ='" & [Forms]![FS_SCWDset_F]![Linktxt] & "'));" Set TmpRs = CurrentDb.OpenRecordset(tmpsqlstr, 2, dbSeeChanges)
If IsNull(TmpRs.Fields("O_NR").Value) Then msgbox "没有相应内容,所以无法显示!", 48, "系统提示" Exit Sub End If
If TmpRs.Recordcount > 0 Then TmpFile = Tmpstr & "\" & TmpRs.Fields(0).Value Open TmpFile For Binary As FileNo On Error GoTo 0
Set TmpRs = CurrentDb.OpenRecordset(tmpsqlstr, 2, dbSeeChanges) With TmpRs Do Until .EOF bit = .Fields("O_NR").Value Put FileNo, , bit .MoveNext Loop End With Close FileNo End If
If TmpFile <> "" Then ShellExecute 0, vbNullString, TmpFile, "", "", vbNormalFocus Else msgbox "不能浏览,确认是否有文件导出后再浏览!", 48, "系统提示" End IfEnd Sub
我现在手头上有一个项目,其中也涉及到要把格式化文本的内容存到image字段,然后在客户端显示出来,最近搞的我头昏脑涨,现在看到了楼上各位热心朋友的指点,对我帮助很大,谢谢啦..... to Wind_LQ(风) 我也想要那份资料,可以吗,谢谢。[email protected]
'向数据库写文件'连接对象 Dim Data As New Recordset '记录集对象 Const Default_BlockSize = 4096 '读写BLOB字段时,默认块的长度 Dim Block() As Byte '把数据分成块 Dim Size As Long '数据长度 '----------------------------------------------- '设置游标类型 Connect.CursorLocation = adUseClient Data.CursorType = adOpenStatic Data.LockType = adLockOptimistic '设置连接字符串 Connect.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=test.mdb" '打开连接 Connect.Open '得到记录集 Data.Open "SELECT * FROM FILE WHERE ID='123456'", Connect, , , adCmdText If Data.RecordCount = 0 Then Exit Sub '打开文件 Open "test.doc" For Binary Access Read As #1 '得到二进制数据的长度 Size = LOF(1) '先按照默认块的大小申请空间 ReDim Block(1 To Default_BlockSize) Do While Size > 0 '如果剩下的数据少于默认块的大小,则按照剩余的数据量申请空间 If Size < Default_BlockSize Then ReDim Block(1 To Size) '从文件中读取一块数据写到字段中 Get #1, , Block Data.Fields("BLOB").AppendChunk Block '修改剩余数据量 Size = Size - Default_BlockSize '响应系统消息 DoEvents Loop '释放空间 ReDim Block(0) '保存字段 Data.Update '关闭文件 Close #1 Set Data = Nothing Connect.Close
'把数据库中的文件写到磁盘'连接对象 Dim Data As New Recordset '记录集对象 Const Default_BlockSize = 4096 '读写BLOB字段时,默认块的长度 Dim Block() As Byte '把数据分成块 Dim Size As Long '数据长度 '----------------------------------------------- '设置游标类型 Connect.CursorLocation = adUseClient Data.CursorType = adOpenStatic Data.LockType = adLockOptimistic '设置连接字符串 Connect.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=test.mdb" '打开连接 Connect.Open '得到记录集 Data.Open "SELECT * FROM FILE WHERE ID='123456'", Connect, , , adCmdText If Data.RecordCount = 0 Then Exit Sub '打开文件 Open "test1.doc" For Binary Access Write As #1 '得到二进制数据的长度 Size = Data.Fields("BLOB").ActualSize '先按照默认块的大小申请空间 ReDim Block(1 To Default_BlockSize) Do While Size > 0 '如果剩下的数据少于默认块的大小,则按照剩余的数据量申请空间 If Size < Default_BlockSize Then ReDim Block(1 To Size) Block = Data.Fields("BLOB").GetChunk(Size) Else '从字段中读取一块数据写到文件中 Block = Data.Fields("BLOB").GetChunk(Default_BlockSize) End If '将数据写到文件中 Put #1, , Block '修改剩余数据量 Size = Size - Default_BlockSize '响应系统消息 DoEvents Loop '释放空间 ReDim Block(0) '关闭文件 Close #1 Set Data = Nothing Connect.Close
介绍介绍。
也可以调用ShellExecute这个API函数来实现。
要代码留E-MAIL地址
[email protected]
可否贴出代码?
先把要存的图片存到一个磁盘文件中,再用文件读取二进的方法把数据写到库里的二进制字段.
这个方法不单可以保存图片,任何磁盘文件都可以保存(word文档,mp3歌,甚至应用程序).
这是我原来给别人解决存图片时写的.
调用时这下面这个API:
VB声明
Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
说明
查找与指定文件关联在一起的程序的文件名
返回值
Long,非零表示成功,零表示失败。会设置GetLastError
参数表
参数 类型及说明
hwnd Long,指定一个窗口的句柄,有时候,windows程序有必要在创建自己的主窗口前显示一个消息框
lpOperation String,指定字串“open”来打开lpFlie文档,或指定“Print”来打印它
lpFile String,想用关联程序打印或打开一个程序名或文件名
lpParameters String,如lpszFlie是可执行文件,则这个字串包含传递给执行程序的参数
lpDirectory String,想使用的完整路径
nShowCmd Long,定义了如何显示启动程序的常数值。参考ShowWindow函数的nCmdShow参数
我用DELPHI写过类似的代码,不过很长时间啦,代码不太记得
Dim file As String
file = "hh.doc"
Me.Adodc1.Recordset.Fields("tx").AppendChunk file
你可以发到我邮箱上:jqsoft#163.com
该范例使用 AppendChunk 和 GetChunk 方法用其他记录中的数据填写图像字段。Public Sub AppendChunkX() Dim cnn1 As ADODB.Connection
Dim rstPubInfo As ADODB.Recordset
Dim strCnn As String
Dim strPubID As String
Dim strPRInfo As String
Dim lngOffset As Long
Dim lngLogoSize As Long
Dim varLogo As Variant
Dim varChunk As Variant
Const conChunkSize = 100 ' 打开连接
Set cnn1 = New ADODB.Connection
strCnn = "Provider=sqloledb;" & _
"Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
cnn1.Open strCnn
' 打开 pub_info 表。
Set rstPubInfo = New ADODB.Recordset
rstPubInfo.CursorType = adOpenKeyset
rstPubInfo.LockType = adLockOptimistic
rstPubInfo.Open "pub_info", cnn1, , , adCmdTable
' 提示复制徽标。
strMsg = "Available logos are : " & vbCr & vbCr
Do While Not rstPubInfo.EOF
strMsg = strMsg & rstPubInfo!pub_id & vbCr & _
Left(rstPubInfo!pr_info, InStr(rstPubInfo!pr_info, ",") - 1) & _
vbCr & vbCr
rstPubInfo.MoveNext
Loop
strMsg = strMsg & "Enter the ID of a logo to copy:"
strPubID = InputBox(strMsg)
' 将徽标复制到大块中的变量。
rstPubInfo.Filter = "pub_id = '" & strPubID & "'"
lngLogoSize = rstPubInfo!logo.ActualSize
Do While lngOffset < lngLogoSize
varChunk = rstPubInfo!logo.GetChunk(conChunkSize)
varLogo = varLogo & varChunk
lngOffset = lngOffset + conChunkSize
Loop
' 从用户得到数据。
strPubID = Trim(InputBox("Enter a new pub ID:"))
strPRInfo = Trim(InputBox("Enter descriptive text:"))
' 添加新记录,将徽标复制到大块中。
rstPubInfo.AddNew
rstPubInfo!pub_id = strPubID
rstPubInfo!pr_info = strPRInfo lngOffset = 0 ' 重置位移。
Do While lngOffset < lngLogoSize
varChunk = LeftB(RightB(varLogo, lngLogoSize - lngOffset), _
conChunkSize)
rstPubInfo!logo.AppendChunk varChunk
lngOffset = lngOffset + conChunkSize
Loop
rstPubInfo.Update
' 显示新添加的数据。
MsgBox "New record: " & rstPubInfo!pub_id & vbCr & _
"Description: " & rstPubInfo!pr_info & vbCr & _
"Logo size: " & rstPubInfo!logo.ActualSize ' 删除新记录,因为这只是演示。
rstPubInfo.Requery
cnn1.Execute "DELETE FROM pub_info " & _
"WHERE pub_id = '" & strPubID & "'" rstPubInfo.Close
cnn1.Close End Sub
http://www.dbstep.com 产品信息里的iOffice文档管理
Private Sub CmdImport_Click()
Dim TmpRs As Recordset '临时记录集
Dim SiZe As Long '文件大小
Dim FileNo As Long '文件号
Dim FieldSize As Long '字段大小
Dim bit() As Byte
Dim I As Long
Dim TmpFileTitle As String
Const MAX_FIELD_SIZE = 1073741824 '最大存储量为2G
FileNo = FreeFile
On Error Resume Next
MBbook = Me![FootChild].Form.Book
TmpDialog.Filename = ""
TmpDialog.Filter = "(*.*)|*.*"
TmpDialog.ShowOpen
'判断打开对话框中是否选择了文件
If Dir(TmpDialog.Filename) = "" Or IsNull(TmpDialog.Filename) Or TmpDialog.Filename = "" Then
Exit Sub
Else
Call Split(TmpDialog.Filename, "\", tmpfilename())
TmpFileTitle = tmpfilename(UBound(tmpfilename))
Open TmpDialog.Filename For Binary As FileNo
SiZe = LOF(FileNo)
If Not (IsNull(Linktxt) Or Linktxt = "10") Then
Set TmpRs = CurrentDb.OpenRecordset("SELECT TW_WD_NR.T_BT,TW_WD_NR.O_NR FROM TW_WD_NR WHERE (((TW_WD_NR.T_WDBH) ='" & [Forms]![FS_SCWDset_F]![Linktxt] & "'));", 2, dbSeeChanges)
If TmpRs.Recordcount > 0 Then
If SiZe > 0 Then
With TmpRs
.Edit
For I = 0 To SiZe Step MAX_FIELD_SIZE
FieldSize = IIf(SiZe - I < MAX_FIELD_SIZE, SiZe - I, MAX_FIELD_SIZE)
ReDim bit(FieldSize - 1)
Get FileNo, , bit
.Fields("O_NR").Value = bit
.Update
Next
End With
End If
Close FileNo
With TmpRs
.Edit
.Fields("T_BT").Value = TmpFileTitle
.Update
.Close
End With
End If
Else
Dim Rs As Recordset
Dim tmpsqlstr As String
Set Rs = CurrentDb.OpenRecordset("SELECT TW_WD_NR.T_WDBH FROM TW_WD_NR WHERE (((TW_WD_NR.T_FLBH) ='" & [Forms]![FS_SCWDset_F]![HeadLink] & "'));", 2, dbSeeChanges)
Set TmpRs = FootChild.Form.RecordsetClone
If Rs.Recordcount < 1 Then
With TmpRs
.AddNew
!T_WDBH = [Forms]![FS_SCWDset_F]![HeadLink] + "001"
!T_WDDH = [Forms]![FS_SCWDset_F]![HeadLink] + "001"
!T_FLBH = [Forms]![FS_SCWDset_F]![HeadLink]
!T_ZJC = "NEW"
!T_BT = TmpFileTitle
If SiZe > 0 Then
For I = 0 To SiZe Step MAX_FIELD_SIZE
FieldSize = IIf(SiZe - I < MAX_FIELD_SIZE, SiZe - I, MAX_FIELD_SIZE)
ReDim bit(FieldSize - 1)
Get FileNo, , bit
.Fields("O_NR").Value = bit
.Update
Next
End If
.Update
End With
Else
With TmpRs
.AddNew
'---------------------------获得最大票号----------------------------
tmpsqlstr = "SELECT Max(TW_WD_NR.T_WDBH) FROM TW_WD_NR WHERE (((TW_WD_NR.T_FLBH)='" & [Forms]![FS_SCWDset_F]![HeadLink] & "'));"
!T_WDBH = GetIDMax(tmpsqlstr)
!T_WDDH = GetIDMax(tmpsqlstr)
!T_FLBH = [Forms]![FS_SCWDset_F]![HeadLink]
!T_ZJC = "NEW"
!T_BT = TmpFileTitle
If SiZe > 0 Then
For I = 0 To SiZe Step MAX_FIELD_SIZE
FieldSize = IIf(SiZe - I < MAX_FIELD_SIZE, SiZe - I, MAX_FIELD_SIZE)
ReDim bit(FieldSize - 1)
Get FileNo, , bit
.Fields("O_NR").Value = bit
.Update
Next
End If
.Update
End With
End If
End If
End If
Close FileNo
Me![FootChild].Form.Requery
Me![FootChild].Form.Book = MBbook
End Sub导出操作
Private Sub CmdExport_Click()
Dim TmpRs As Recordset '临时记录集
Dim tmpsqlstr As String
Dim FileNo As Long '文件号
Dim bit() As Byte '字节数组
Dim I As Long
Dim TmpFilter As String
FileNo = FreeFile
'Fu 2000-11-15
'为 以下的Sql添加一个条件 内容不能为空
tmpsqlstr = "SELECT TW_WD_NR.* FROM TW_WD_NR WHERE (((TW_WD_NR.O_NR) Is Not Null) AND ((TW_WD_NR.T_WDBH)='" & [Forms]![FS_SCWDset_F]![Linktxt] & "'));"
Set TmpRs = CurrentDb.OpenRecordset(tmpsqlstr, 2, dbSeeChanges)
If TmpRs.Recordcount > 0 Then
Call Split(TmpRs.Fields("T_BT").Value, ".", tmpfilename())
TmpFilter = tmpfilename(UBound(tmpfilename))
With TmpDialog
.Filename = ""
.Filter = "(*." & TmpFilter & ")|*." & TmpFilter
.ShowSave
End With
'将数据库中的文档内容存入指定文件中
If IsNull(TmpDialog.Filename) Or TmpDialog.Filename = "" Then
Exit Sub
Else
Open TmpDialog.Filename For Binary As FileNo
On Error GoTo 0
Set TmpRs = CurrentDb.OpenRecordset(tmpsqlstr, 2, dbSeeChanges)
With TmpRs
Do Until .EOF
bit = .Fields("O_NR").Value
Put FileNo, , bit
.MoveNext
Loop
End With
Close FileNo
End If
Else
msgbox "没有相应内容,所以无法导出!", 48, "系统提示"
Exit Sub
End If
End Sub导出显示
Private Sub CmdWD_Click()
Dim TmpRs As Recordset '临时记录集
Dim tmpsqlstr As String
Dim FileNo As Long '文件号
Dim bit() As Byte '字节数组
Dim I As Long
Dim CurrentPath As String
Dim TmpFile As String
Dim Tmpstr As String
FileNo = FreeFile
CurrentPath = curdbpath
Tmpstr = CurrentPath & "TmpDir"
TmpFile = ""
On Error Resume Next
If Dir(Tmpstr, vbDirectory) = "" Then
MkDir Tmpstr
End If
tmpsqlstr = "SELECT TW_WD_NR.T_BT,TW_WD_NR.O_NR FROM TW_WD_NR WHERE (((TW_WD_NR.T_WDBH) ='" & [Forms]![FS_SCWDset_F]![Linktxt] & "'));"
Set TmpRs = CurrentDb.OpenRecordset(tmpsqlstr, 2, dbSeeChanges)
If IsNull(TmpRs.Fields("O_NR").Value) Then
msgbox "没有相应内容,所以无法显示!", 48, "系统提示"
Exit Sub
End If
If TmpRs.Recordcount > 0 Then
TmpFile = Tmpstr & "\" & TmpRs.Fields(0).Value
Open TmpFile For Binary As FileNo
On Error GoTo 0
Set TmpRs = CurrentDb.OpenRecordset(tmpsqlstr, 2, dbSeeChanges)
With TmpRs
Do Until .EOF
bit = .Fields("O_NR").Value
Put FileNo, , bit
.MoveNext
Loop
End With
Close FileNo
End If
If TmpFile <> "" Then
ShellExecute 0, vbNullString, TmpFile, "", "", vbNormalFocus
Else
msgbox "不能浏览,确认是否有文件导出后再浏览!", 48, "系统提示"
End IfEnd Sub
to Wind_LQ(风)
我也想要那份资料,可以吗,谢谢。[email protected]
Dim Data As New Recordset
'记录集对象
Const Default_BlockSize = 4096
'读写BLOB字段时,默认块的长度
Dim Block() As Byte
'把数据分成块
Dim Size As Long
'数据长度
'-----------------------------------------------
'设置游标类型
Connect.CursorLocation = adUseClient
Data.CursorType = adOpenStatic
Data.LockType = adLockOptimistic
'设置连接字符串
Connect.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=test.mdb"
'打开连接
Connect.Open
'得到记录集
Data.Open "SELECT * FROM FILE WHERE ID='123456'", Connect, , , adCmdText
If Data.RecordCount = 0 Then Exit Sub
'打开文件
Open "test.doc" For Binary Access Read As #1
'得到二进制数据的长度
Size = LOF(1)
'先按照默认块的大小申请空间
ReDim Block(1 To Default_BlockSize)
Do While Size > 0
'如果剩下的数据少于默认块的大小,则按照剩余的数据量申请空间
If Size < Default_BlockSize Then ReDim Block(1 To Size)
'从文件中读取一块数据写到字段中
Get #1, , Block
Data.Fields("BLOB").AppendChunk Block
'修改剩余数据量
Size = Size - Default_BlockSize
'响应系统消息
DoEvents
Loop
'释放空间
ReDim Block(0)
'保存字段
Data.Update
'关闭文件
Close #1
Set Data = Nothing
Connect.Close
Dim Data As New Recordset
'记录集对象
Const Default_BlockSize = 4096
'读写BLOB字段时,默认块的长度
Dim Block() As Byte
'把数据分成块
Dim Size As Long
'数据长度
'-----------------------------------------------
'设置游标类型
Connect.CursorLocation = adUseClient
Data.CursorType = adOpenStatic
Data.LockType = adLockOptimistic
'设置连接字符串
Connect.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=test.mdb"
'打开连接
Connect.Open
'得到记录集
Data.Open "SELECT * FROM FILE WHERE ID='123456'", Connect, , , adCmdText
If Data.RecordCount = 0 Then Exit Sub
'打开文件
Open "test1.doc" For Binary Access Write As #1
'得到二进制数据的长度
Size = Data.Fields("BLOB").ActualSize
'先按照默认块的大小申请空间
ReDim Block(1 To Default_BlockSize)
Do While Size > 0
'如果剩下的数据少于默认块的大小,则按照剩余的数据量申请空间
If Size < Default_BlockSize Then
ReDim Block(1 To Size)
Block = Data.Fields("BLOB").GetChunk(Size)
Else
'从字段中读取一块数据写到文件中
Block = Data.Fields("BLOB").GetChunk(Default_BlockSize)
End If
'将数据写到文件中
Put #1, , Block
'修改剩余数据量
Size = Size - Default_BlockSize
'响应系统消息
DoEvents
Loop
'释放空间
ReDim Block(0)
'关闭文件
Close #1
Set Data = Nothing
Connect.Close