使用Stream对象,可以实现对数据库的图像存取。 数据库中存放图像的字段是二进制类型(Access为OLE类型)。 比如,如果用“CommonDialog”控件来选择你硬盘上的图像文件; 用“Picture”控件来显示图像,那么下面的代码供参考: (已连接数据库,打开了相应的记录集rs) Dim StmPic As ADODB.Stream Dim StrPicTemp As String ...... '保存你所选择的图像 Set StmPic = New ADODB.Stream StmPic.Type = adTypeBinary '指定流是二进制类型 StmPic.Open '将数据获取到Stream对象中 StmPic.LoadFromFile (CommonDialog1.FileName) '将选择的图像加载到打开的StmPic中 rs.AddNew rs.Fields(1).Value = StmPic.Read '从StmPic对象中读取数据 rs.Update StmPic.Close ...... '读取显示数据库中的图像 Set StmPic = New ADODB.Stream StrPicTemp = "c:\temp.tmp" '临时文件,用来保存读出的图片 With StmPic .Type = adTypeBinary .Open .Write rs.Fields(1) '写入数据库中的数据至Stream中 .SaveToFile StrPicTemp, adSaveCreateOverWrite '将Stream中数据写入临时文件中 .Close End With Picture1.Picture = LoadPicture(StrPicTemp) '用Picture控件显示图像 ......
给你这个模块里面的两个函数,一个是写图片到数据库,一个是读出来,blobColumn表示图片要写入的字段名,FileName表示图片在硬盘上的路径Option ExplicitPublic Function AppendBlobFromFile(blobColumn As Field, ByVal FileName As String) 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 AppendBlobFromFile = False ChunkSize = 2048 '限制每次读取的块大小为 2K 'FreeFile 返回一个 Integer,代表下一个可供 Open 语句使用的文件号 FileNumber = FreeFile '产生随机的文件号 '语法:Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength] 'pathname: 必要。字符串表达式,指定文件名,该文件名可能还包括目录、文件夹及驱动器。 'mode: 必要。关键字,指定文件方式,有 Append、Binary、Input、Output、或 Random 方式。如果未指定方式,则以 Random 访问方式打开文件。 'access: 可选。关键字,说明打开的文件可以进行的操作,有 Read、Write、或 Read Write 操作。 'lock: 可选。关键字,说明限定于其它进程打开的文件的操作,有 Shared、Lock Read、Lock Write、和 Lock Read Write 操作。 'filenumber: 必要。一个有效的文件号,范围在 1 到 511 之间。使用 FreeFile 函数可得到下一个可用的文件号。 'reclength: 可选。小于或等于 32,767(字节)的一个数。对于用随机访问方式打开的文件,该值就是记录长度。对于顺序文件,该值就是缓冲字符数。 Open FileName For Binary Access Read As FileNumber '打开图像文件 DataLen = LOF(FileNumber) '获得文件长度 Length Of File If IsNull(blobColumn) Then Exit Function '为空,还未赋值,可先用update或insert语句赋值
If DataLen = 0 Then '文件长度为0 Close FileNumber '关闭文件 AppendBlobFromFile = True Exit Function End If
Chunks = DataLen \ ChunkSize '数据块的个数 Fragment = DataLen Mod ChunkSize If Fragment > 0 Then '先写零碎数据 ReDim ChunkAry(Fragment - 1) '将一个已打开的磁盘文件读入一个变量之中。 '语法:Get [#]filenumber, [recnumber], varname 'filenumber: 必要。任何有效的文件号。 'recnumber: 可选。Variant (Long)。记录号(Random 方式的文件)或字节数(Binary 方式的文件), '以表示在此处开始读出数据。 'varname: 必要。一个有效的变量名,将读出的数据放入其中。 Get FileNumber, , ChunkAry() '读出文件 'AppendChyunk:将数据追加到大型文本、二进制数据 Field 或 Parameter 对象。 '对 Field 对象的第一个 AppendChunk 调用将数据写入字段,覆盖所有现有的数据,随后的 AppendChunk '调用则添加到现有数据。 blobColumn.AppendChunk ChunkAry '调用AppendChunk函数写数据 End If
ReDim ChunkAry(ChunkSize - 1) '为数据块开辟空间 For lngI = 1 To Chunks '循环读出所有数据块 Get FileNumber, , ChunkAry() '读出一块数据 blobColumn.AppendChunk ChunkAry '在数据库中增加数据块 Next lngI Close FileNumber '关闭文件 AppendBlobFromFile = True Exit Function ErrorHandle: AppendBlobFromFile = False MsgBox Err.Description, vbCritical, "写数据出错!" End Function Public Function ReadbolbToFile(blobColumn As Field, ByVal FileName As String) 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 ReadbolbToFile = False ChunkSize = 2048 '定义块大小为 2K If IsNull(blobColumn) Then Exit Function '该范例使用 ActualSize 和 DefinedSize 属性显示字段的实际大小和定义大小。 DataLen = blobColumn.ActualSize '获得图像大小 If DataLen < 8 Then Exit Function '图像大小小于8字节时认为不是图像信息 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) '语法:与get函数一样Put [#]filenumber, [recnumber], varname '将一个变量的数据写入磁盘文件中。 Put FileNumber, , ChunkAry '将二进制数据写为文件 End If ReDim ChunkAry(ChunkSize - 1) '为数据块重新开辟空间 For lngI = 1 To Chunks '循环读出所有块 ChunkAry = blobColumn.GetChunk(ChunkSize) '在数据库中连续读数据块 Put FileNumber, , ChunkAry() '将数据块写入文件中 Next lngI Close FileNumber '关闭文件 ReadbolbToFile = True Exit Function ErrorHandle: ReadbolbToFile = False MsgBox Err.Description, vbCritical, "读数据出错!" End Function去试一试 My Email:[email protected]
可以用 ADODB.Stream来实现:Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim stm As ADODB.StreamPrivate Sub SavePictureToDB(cn As ADODB.Connection) '将BMP图片存入数据库 On Error GoTo EH Set stm = New ADODB.Stream rs.Open "select ImagePath,ImageValue from tbl_Image", cn, adOpenKeyset, adLockOptimistic CommonDialog1.ShowOpen Text1.Text = CommonDialog1.FileName
With stm .Type = adTypeBinary .Open .LoadFromFile CommonDialog1.FileName End With With rs .AddNew .Fields("ImagePath") = Text1.Text .Fields("ImageValue") = stm.Read .Update End With rs.Close Set rs = Nothing Exit Sub EH: MsgBox Err.Description, vbInformation, "Error" End Sub Private Sub LoadPictureFromDB(cn As ADODB.Connection) '载数据库中读出BMP图片 On Error GoTo EH Dim strTemp As String Set stm = New ADODB.Stream strTemp = "c:\temp.tmp" '临时文件,用来保存读出的图片 rs.Open "select ImagePath,ImageValue from tbl_image", cn, , , adCmdText With stm .Type = adTypeBinary .Open .Write rs("ImageValue") .SaveToFile strTemp, adSaveCreateOverWrite .Close End With Image1.Picture = LoadPicture(strTemp) Set stm = Nothing rs.Close Set rs = Nothing Exit Sub EH: MsgBox Err.Description, vbInformation, "Error" End Sub
************************************************************************* '** '** 使用 ADODB.Stream 保存/读取文件到数据库 '** 引用 Microsoft ActiveX Data Objects 2.5 Library 及以上版本 '** '** ----- 数据库连接字符串模板 --------------------------------------- '** ACCESS数据库 '** iConcStr = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False" & _ '** ";Data Source=数据库名" '** '** SQL数据库 '** iConcStr = "Provider=SQLOLEDB.1;Persist Security Info=True;" & _ '** "User ID=用户名;Password=密码;Initial Catalog=数据库名;Data Source=SQL服务器名" '** '************************************************************************* ' '保存文件到数据库中 Sub s_SaveFile() Dim iStm As ADODB.Stream Dim iRe As ADODB.Recordset Dim iConcStr As String
'读取文件到内容 Set iStm = New ADODB.Stream With iStm .Type = adTypeBinary '二进制模式 .Open .LoadFromFile "c:\test.doc" End With
'打开保存文件的表 Set iRe = New ADODB.Recordset With iRe .Open "表", iConc, adOpenKeyset, adLockOptimistic .AddNew '新增一条记录 .Fields("保存文件内容的字段") = iStm.Read .Update End With
'完成后关闭对象 iRe.Close iStm.Close End Sub'从数据库中读取数据,保存成文件 Sub s_ReadFile() Dim iStm As ADODB.Stream Dim iRe As ADODB.Recordset Dim iConc As String
'打开表 Set iRe = New ADODB.Recordset iRe.Open "tb_img", iConc, adOpenKeyset, adLockReadOnly iRe.Filter = "id=64"
'保存到文件 Set iStm = New ADODB.Stream With iStm .Mode = adModeReadWrite .Type = adTypeBinary .Open .Write iRe("img") .SaveToFile "c:\test.doc" End With
'关闭对象 iRe.Close iStm.Close End Sub
'存储照片文件到数据库 Public Function WriteToDB(ByRef col As ADODB.Field, ByVal FileName As String) As Boolean On Error GoTo ErrMsg Dim mStream As ADODB.Stream Set mStream = New ADODB.Stream
mStream.Close Set mStream = Nothing WriteToDB = True Exit Function ErrMsg: MsgBox "存储照片到数据库时出现错误." & vbCrLf & Err.Description, vbExclamation + vbOKOnly, "提示" End Function'设置临时照片文件 Public Function ReadDB(col As ADODB.Field, ByRef imgFile As String) As Boolean On Error GoTo ErrRead Dim mStream As New ADODB.Stream ReadDB = False
If col.ActualSize < 200 Then Exit Function
mStream.Type = adTypeBinary mStream.Open mStream.Write col.Value mStream.SaveToFile imgFile, adSaveCreateOverWrite ReadDB = True Exit Function ErrRead: MsgBox "设置临时照片文件时出现错误:" & vbCrLf & Err.Description, vbInformation, "提示" ReadDB = False End FunctionWriteToDB使用示例: '把图片写入到数据库 strSQL = "select * from " & strTable _ & " where BBID='" & strBBID & "'" _ & " and ReportIndex=" & objControl.Index _ & " and ReportType=" & WPhoto Set rsTemp = New ADODB.Recordset rsTemp.Open strSQL, GCon, adOpenDynamic, adLockOptimistic WriteToDB rsTemp("ReportPhoto"), mstrTempFile rsTemp.Update rsTemp.Close
数据库中存放图像的字段是二进制类型(Access为OLE类型)。
比如,如果用“CommonDialog”控件来选择你硬盘上的图像文件;
用“Picture”控件来显示图像,那么下面的代码供参考:
(已连接数据库,打开了相应的记录集rs)
Dim StmPic As ADODB.Stream
Dim StrPicTemp As String
......
'保存你所选择的图像
Set StmPic = New ADODB.Stream
StmPic.Type = adTypeBinary '指定流是二进制类型
StmPic.Open '将数据获取到Stream对象中
StmPic.LoadFromFile (CommonDialog1.FileName) '将选择的图像加载到打开的StmPic中
rs.AddNew
rs.Fields(1).Value = StmPic.Read '从StmPic对象中读取数据
rs.Update
StmPic.Close
......
'读取显示数据库中的图像
Set StmPic = New ADODB.Stream
StrPicTemp = "c:\temp.tmp" '临时文件,用来保存读出的图片
With StmPic
.Type = adTypeBinary
.Open
.Write rs.Fields(1) '写入数据库中的数据至Stream中
.SaveToFile StrPicTemp, adSaveCreateOverWrite '将Stream中数据写入临时文件中
.Close
End With
Picture1.Picture = LoadPicture(StrPicTemp) '用Picture控件显示图像
......
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
AppendBlobFromFile = False
ChunkSize = 2048 '限制每次读取的块大小为 2K
'FreeFile 返回一个 Integer,代表下一个可供 Open 语句使用的文件号
FileNumber = FreeFile '产生随机的文件号
'语法:Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength]
'pathname: 必要。字符串表达式,指定文件名,该文件名可能还包括目录、文件夹及驱动器。
'mode: 必要。关键字,指定文件方式,有 Append、Binary、Input、Output、或 Random 方式。如果未指定方式,则以 Random 访问方式打开文件。
'access: 可选。关键字,说明打开的文件可以进行的操作,有 Read、Write、或 Read Write 操作。
'lock: 可选。关键字,说明限定于其它进程打开的文件的操作,有 Shared、Lock Read、Lock Write、和 Lock Read Write 操作。
'filenumber: 必要。一个有效的文件号,范围在 1 到 511 之间。使用 FreeFile 函数可得到下一个可用的文件号。
'reclength: 可选。小于或等于 32,767(字节)的一个数。对于用随机访问方式打开的文件,该值就是记录长度。对于顺序文件,该值就是缓冲字符数。
Open FileName For Binary Access Read As FileNumber '打开图像文件
DataLen = LOF(FileNumber) '获得文件长度 Length Of File
If IsNull(blobColumn) Then Exit Function '为空,还未赋值,可先用update或insert语句赋值
If DataLen = 0 Then '文件长度为0
Close FileNumber '关闭文件
AppendBlobFromFile = True
Exit Function
End If
Chunks = DataLen \ ChunkSize '数据块的个数
Fragment = DataLen Mod ChunkSize
If Fragment > 0 Then '先写零碎数据
ReDim ChunkAry(Fragment - 1)
'将一个已打开的磁盘文件读入一个变量之中。
'语法:Get [#]filenumber, [recnumber], varname
'filenumber: 必要。任何有效的文件号。
'recnumber: 可选。Variant (Long)。记录号(Random 方式的文件)或字节数(Binary 方式的文件),
'以表示在此处开始读出数据。
'varname: 必要。一个有效的变量名,将读出的数据放入其中。
Get FileNumber, , ChunkAry() '读出文件
'AppendChyunk:将数据追加到大型文本、二进制数据 Field 或 Parameter 对象。
'对 Field 对象的第一个 AppendChunk 调用将数据写入字段,覆盖所有现有的数据,随后的 AppendChunk
'调用则添加到现有数据。
blobColumn.AppendChunk ChunkAry '调用AppendChunk函数写数据
End If
ReDim ChunkAry(ChunkSize - 1) '为数据块开辟空间
For lngI = 1 To Chunks '循环读出所有数据块
Get FileNumber, , ChunkAry() '读出一块数据
blobColumn.AppendChunk ChunkAry '在数据库中增加数据块
Next lngI
Close FileNumber '关闭文件
AppendBlobFromFile = True
Exit Function
ErrorHandle:
AppendBlobFromFile = False
MsgBox Err.Description, vbCritical, "写数据出错!"
End Function
Public Function ReadbolbToFile(blobColumn As Field, ByVal FileName As String) 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
ReadbolbToFile = False
ChunkSize = 2048 '定义块大小为 2K
If IsNull(blobColumn) Then Exit Function
'该范例使用 ActualSize 和 DefinedSize 属性显示字段的实际大小和定义大小。
DataLen = blobColumn.ActualSize '获得图像大小
If DataLen < 8 Then Exit Function '图像大小小于8字节时认为不是图像信息
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)
'语法:与get函数一样Put [#]filenumber, [recnumber], varname
'将一个变量的数据写入磁盘文件中。
Put FileNumber, , ChunkAry '将二进制数据写为文件
End If
ReDim ChunkAry(ChunkSize - 1) '为数据块重新开辟空间
For lngI = 1 To Chunks '循环读出所有块
ChunkAry = blobColumn.GetChunk(ChunkSize) '在数据库中连续读数据块
Put FileNumber, , ChunkAry() '将数据块写入文件中
Next lngI
Close FileNumber '关闭文件
ReadbolbToFile = True
Exit Function
ErrorHandle:
ReadbolbToFile = False
MsgBox Err.Description, vbCritical, "读数据出错!"
End Function去试一试
My Email:[email protected]
Dim rs As New ADODB.Recordset
Dim stm As ADODB.StreamPrivate Sub SavePictureToDB(cn As ADODB.Connection)
'将BMP图片存入数据库
On Error GoTo EH
Set stm = New ADODB.Stream
rs.Open "select ImagePath,ImageValue from tbl_Image", cn, adOpenKeyset, adLockOptimistic
CommonDialog1.ShowOpen
Text1.Text = CommonDialog1.FileName
With stm
.Type = adTypeBinary
.Open
.LoadFromFile CommonDialog1.FileName
End With
With rs
.AddNew
.Fields("ImagePath") = Text1.Text
.Fields("ImageValue") = stm.Read
.Update
End With
rs.Close
Set rs = Nothing
Exit Sub
EH: MsgBox Err.Description, vbInformation, "Error"
End Sub
Private Sub LoadPictureFromDB(cn As ADODB.Connection)
'载数据库中读出BMP图片
On Error GoTo EH
Dim strTemp As String
Set stm = New ADODB.Stream
strTemp = "c:\temp.tmp" '临时文件,用来保存读出的图片
rs.Open "select ImagePath,ImageValue from tbl_image", cn, , , adCmdText
With stm
.Type = adTypeBinary
.Open
.Write rs("ImageValue")
.SaveToFile strTemp, adSaveCreateOverWrite
.Close
End With
Image1.Picture = LoadPicture(strTemp)
Set stm = Nothing
rs.Close
Set rs = Nothing
Exit Sub
EH: MsgBox Err.Description, vbInformation, "Error"
End Sub
'**
'** 使用 ADODB.Stream 保存/读取文件到数据库
'** 引用 Microsoft ActiveX Data Objects 2.5 Library 及以上版本
'**
'** ----- 数据库连接字符串模板 ---------------------------------------
'** ACCESS数据库
'** iConcStr = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False" & _
'** ";Data Source=数据库名"
'**
'** SQL数据库
'** iConcStr = "Provider=SQLOLEDB.1;Persist Security Info=True;" & _
'** "User ID=用户名;Password=密码;Initial Catalog=数据库名;Data Source=SQL服务器名"
'**
'*************************************************************************
'
'保存文件到数据库中
Sub s_SaveFile()
Dim iStm As ADODB.Stream
Dim iRe As ADODB.Recordset
Dim iConcStr As String
'数据库连接字符串
iConcStr = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False" & _
";Data Source=F:\My Documents\客户资料1.mdb"
'读取文件到内容
Set iStm = New ADODB.Stream
With iStm
.Type = adTypeBinary '二进制模式
.Open
.LoadFromFile "c:\test.doc"
End With
'打开保存文件的表
Set iRe = New ADODB.Recordset
With iRe
.Open "表", iConc, adOpenKeyset, adLockOptimistic
.AddNew '新增一条记录
.Fields("保存文件内容的字段") = iStm.Read
.Update
End With
'完成后关闭对象
iRe.Close
iStm.Close
End Sub'从数据库中读取数据,保存成文件
Sub s_ReadFile()
Dim iStm As ADODB.Stream
Dim iRe As ADODB.Recordset
Dim iConc As String
'数据库连接字符串
iConc = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False" & _
";Data Source=\\xz\c$\Inetpub\zj\zj\zj.mdb"
'打开表
Set iRe = New ADODB.Recordset
iRe.Open "tb_img", iConc, adOpenKeyset, adLockReadOnly
iRe.Filter = "id=64"
'保存到文件
Set iStm = New ADODB.Stream
With iStm
.Mode = adModeReadWrite
.Type = adTypeBinary
.Open
.Write iRe("img")
.SaveToFile "c:\test.doc"
End With
'关闭对象
iRe.Close
iStm.Close
End Sub
Public Function WriteToDB(ByRef col As ADODB.Field, ByVal FileName As String) As Boolean
On Error GoTo ErrMsg
Dim mStream As ADODB.Stream
Set mStream = New ADODB.Stream
WriteToDB = False
mStream.Type = adTypeBinary
mStream.Open
mStream.LoadFromFile FileName
col.Value = mStream.Read
mStream.Close
Set mStream = Nothing
WriteToDB = True
Exit Function
ErrMsg:
MsgBox "存储照片到数据库时出现错误." & vbCrLf & Err.Description, vbExclamation + vbOKOnly, "提示"
End Function'设置临时照片文件
Public Function ReadDB(col As ADODB.Field, ByRef imgFile As String) As Boolean
On Error GoTo ErrRead
Dim mStream As New ADODB.Stream
ReadDB = False
If col.ActualSize < 200 Then Exit Function
mStream.Type = adTypeBinary
mStream.Open
mStream.Write col.Value
mStream.SaveToFile imgFile, adSaveCreateOverWrite
ReadDB = True
Exit Function
ErrRead:
MsgBox "设置临时照片文件时出现错误:" & vbCrLf & Err.Description, vbInformation, "提示"
ReadDB = False
End FunctionWriteToDB使用示例:
'把图片写入到数据库
strSQL = "select * from " & strTable _
& " where BBID='" & strBBID & "'" _
& " and ReportIndex=" & objControl.Index _
& " and ReportType=" & WPhoto
Set rsTemp = New ADODB.Recordset
rsTemp.Open strSQL, GCon, adOpenDynamic, adLockOptimistic
WriteToDB rsTemp("ReportPhoto"), mstrTempFile
rsTemp.Update
rsTemp.Close