下面是原来我做过的将图片文件存入数据库的例子,DOC文件的路子是一样的,你可以看看:)
主要是使用AppendChunk和GetChunk方法,以下是frm文件中的源代码,代码中有功能的注释: Option Explicit ' 本程序使用的 Access 数据库的格式如下:
'
' 数据库名称: picdata.mdb
' 表名称: pic
' 字段列表:
' ID 自动编号
' Key 图片描述(文本)
' FileName 图片文件名称(文本)
' FileData 图片的二进制数据(OLE对象)
'
' 使用方法:使用 Browse 按钮浏览图片,使用 Save 按钮将图片存储到数据库。 Private Const BLOCK_SIZE = 1024 * 8 '设定一次读取的缓冲区大小(8K) Private Cnn As Connection
Private Rst As Recordset '用于添加数据的记录集合
Private WithEvents RstView As Recordset '用于浏览的记录集合 ' 这个Sub用于显示“打开文件”对话框 Private Sub cmdBrowse_Click() cdlOpen.Filter = "BMP¦*.bmp¦GIF¦*.gif¦JPEG¦*.jpg"
cdlOpen.FileName = ""
cdlOpen.ShowOpen
If cdlOpen.FileName = "" Then Exit Sub
Debug.Print cdlOpen.FileName
Debug.Print cdlOpen.FileTitle
txtFileName.Text = cdlOpen.FileName
txtDesc.Text = cdlOpen.FileTitle End Sub ' 这个Sub用于将选定的图片存储到数据库中 Private Sub cmdSave_Click() On Error GoTo TransError Dim fs As Object
Dim buf() As Byte
Dim intFileId As Long
Dim intFileSize As Long
Dim i As Integer, j As Integer, k As Integer Set fs = CreateObject("Scripting.FileSystemObject")
If Not fs.fileexists(txtFileName.Text) Then
MsgBox "Can not read file! - " & txtFileName.Text
Exit Sub
End If
If txtDesc.Text = "" Then
MsgBox "Please input the description for the file!"
Exit Sub
End If
intFileId = FreeFile()
Open cdlOpen.FileName For Binary Access Read As #intFileId
intFileSize = LOF(intFileId)
i = intFileSize \ BLOCK_SIZE
j = intFileSize Mod BLOCK_SIZE
ReDim buf(BLOCK_SIZE)
Screen.MousePointer = 11
DoEvents
Rem {{{{
Cnn.BeginTrans
Rst.AddNew
Rst("FileName") = txtDesc.Text
Rst("Key") = txtDesc.Text
For k = 1 To i
Get #intFileId, , buf()
Rst("FileData").AppendChunk buf()
Next
If j <> 0 Then
ReDim buf(j)
Get #intFileId, , buf()
Rst("FileData").AppendChunk buf()
End If
Rst.Update
Cnn.CommitTrans
Rem }}}}
Close #intFileId
RstView.Requery
datFileDesc.Refresh
Screen.MousePointer = 0
txtFileName.Text = ""
txtDesc.Text = ""
Exit Sub
TransError: MsgBox "Error! - " & Err.Description
Err.Clear
Cnn.RollbackTrans End Sub ' 在窗体加载时打开数据库连接,并进行记录集初始化 Private Sub Form_Load() Dim openString As String Set Cnn = CreateObject("ADODB.Connection")
Cnn.CursorLocation = adUseClient
openString = "DBQ=" & App.Path & "\PicData.MDB;"
openString = openString & "DRIVER={Microsoft Access Driver (*.mdb)}"
Cnn.Open openString
Set Rst = CreateObject("ADODB.Recordset")
Set RstView = Cnn.Execute("Select key,filename,id from pic")
Rst.CursorType = adOpenKeyset
Rst.LockType = adLockOptimistic
Rst.Open "pic", Cnn, , , adCmdTable
Set datFileDesc.DataSource = RstView End Sub ' 在记录集发生移动时(Datagrid被单击时)显示图片 Private Sub RstView_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset) Dim buf() As Byte
Dim intFileId As Long
Dim intFileSize As Long
Dim i As Integer, j As Integer, k As Integer
Dim RstTmp As Recordset If RstView.EOF() Or RstView.BOF() Then Exit Sub Set RstTmp = Cnn.Execute("Select FileData From Pic Where ID=" & RstView("ID"))
intFileId = FreeFile()
Open App.Path & "\" & RstView("FileName") _
For Binary Access Write As #intFileId
intFileSize = RstTmp("FileData").ActualSize
Debug.Print "intFileSize = " & intFileSize
i = intFileSize \ BLOCK_SIZE
j = intFileSize Mod BLOCK_SIZE
ReDim buf(i)
Rem {{{{
For k = 1 To i
buf() = RstTmp("FileData").GetChunk(BLOCK_SIZE)
Put #intFileId, , buf()
Next
If j <> 0 Then
ReDim buf(BLOCK_SIZE)
buf() = RstTmp("FileData").GetChunk(j)
Put #intFileId, , buf()
End If
Rem }}}}
Close #intFileId
pic1.Picture = LoadPicture(App.Path & "\" & RstView("FileName"))
Kill App.Path & "\" & RstView("FileName") End Sub
主要是使用AppendChunk和GetChunk方法,以下是frm文件中的源代码,代码中有功能的注释: Option Explicit ' 本程序使用的 Access 数据库的格式如下:
'
' 数据库名称: picdata.mdb
' 表名称: pic
' 字段列表:
' ID 自动编号
' Key 图片描述(文本)
' FileName 图片文件名称(文本)
' FileData 图片的二进制数据(OLE对象)
'
' 使用方法:使用 Browse 按钮浏览图片,使用 Save 按钮将图片存储到数据库。 Private Const BLOCK_SIZE = 1024 * 8 '设定一次读取的缓冲区大小(8K) Private Cnn As Connection
Private Rst As Recordset '用于添加数据的记录集合
Private WithEvents RstView As Recordset '用于浏览的记录集合 ' 这个Sub用于显示“打开文件”对话框 Private Sub cmdBrowse_Click() cdlOpen.Filter = "BMP¦*.bmp¦GIF¦*.gif¦JPEG¦*.jpg"
cdlOpen.FileName = ""
cdlOpen.ShowOpen
If cdlOpen.FileName = "" Then Exit Sub
Debug.Print cdlOpen.FileName
Debug.Print cdlOpen.FileTitle
txtFileName.Text = cdlOpen.FileName
txtDesc.Text = cdlOpen.FileTitle End Sub ' 这个Sub用于将选定的图片存储到数据库中 Private Sub cmdSave_Click() On Error GoTo TransError Dim fs As Object
Dim buf() As Byte
Dim intFileId As Long
Dim intFileSize As Long
Dim i As Integer, j As Integer, k As Integer Set fs = CreateObject("Scripting.FileSystemObject")
If Not fs.fileexists(txtFileName.Text) Then
MsgBox "Can not read file! - " & txtFileName.Text
Exit Sub
End If
If txtDesc.Text = "" Then
MsgBox "Please input the description for the file!"
Exit Sub
End If
intFileId = FreeFile()
Open cdlOpen.FileName For Binary Access Read As #intFileId
intFileSize = LOF(intFileId)
i = intFileSize \ BLOCK_SIZE
j = intFileSize Mod BLOCK_SIZE
ReDim buf(BLOCK_SIZE)
Screen.MousePointer = 11
DoEvents
Rem {{{{
Cnn.BeginTrans
Rst.AddNew
Rst("FileName") = txtDesc.Text
Rst("Key") = txtDesc.Text
For k = 1 To i
Get #intFileId, , buf()
Rst("FileData").AppendChunk buf()
Next
If j <> 0 Then
ReDim buf(j)
Get #intFileId, , buf()
Rst("FileData").AppendChunk buf()
End If
Rst.Update
Cnn.CommitTrans
Rem }}}}
Close #intFileId
RstView.Requery
datFileDesc.Refresh
Screen.MousePointer = 0
txtFileName.Text = ""
txtDesc.Text = ""
Exit Sub
TransError: MsgBox "Error! - " & Err.Description
Err.Clear
Cnn.RollbackTrans End Sub ' 在窗体加载时打开数据库连接,并进行记录集初始化 Private Sub Form_Load() Dim openString As String Set Cnn = CreateObject("ADODB.Connection")
Cnn.CursorLocation = adUseClient
openString = "DBQ=" & App.Path & "\PicData.MDB;"
openString = openString & "DRIVER={Microsoft Access Driver (*.mdb)}"
Cnn.Open openString
Set Rst = CreateObject("ADODB.Recordset")
Set RstView = Cnn.Execute("Select key,filename,id from pic")
Rst.CursorType = adOpenKeyset
Rst.LockType = adLockOptimistic
Rst.Open "pic", Cnn, , , adCmdTable
Set datFileDesc.DataSource = RstView End Sub ' 在记录集发生移动时(Datagrid被单击时)显示图片 Private Sub RstView_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset) Dim buf() As Byte
Dim intFileId As Long
Dim intFileSize As Long
Dim i As Integer, j As Integer, k As Integer
Dim RstTmp As Recordset If RstView.EOF() Or RstView.BOF() Then Exit Sub Set RstTmp = Cnn.Execute("Select FileData From Pic Where ID=" & RstView("ID"))
intFileId = FreeFile()
Open App.Path & "\" & RstView("FileName") _
For Binary Access Write As #intFileId
intFileSize = RstTmp("FileData").ActualSize
Debug.Print "intFileSize = " & intFileSize
i = intFileSize \ BLOCK_SIZE
j = intFileSize Mod BLOCK_SIZE
ReDim buf(i)
Rem {{{{
For k = 1 To i
buf() = RstTmp("FileData").GetChunk(BLOCK_SIZE)
Put #intFileId, , buf()
Next
If j <> 0 Then
ReDim buf(BLOCK_SIZE)
buf() = RstTmp("FileData").GetChunk(j)
Put #intFileId, , buf()
End If
Rem }}}}
Close #intFileId
pic1.Picture = LoadPicture(App.Path & "\" & RstView("FileName"))
Kill App.Path & "\" & RstView("FileName") End Sub
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货