'以下内容为转摘:使用流对象保存和显示图片 打开vb6,新建工程。添加两个按钮,一个image控件 注意:Access中的photo字段类型为OLE对象. SqlServer中的photo字段类型为Image'** 引用 Microsoft ActiveX Data Objects 2.5 Library 及以上版本 ‘2.5版本以下不支持Stream对象 Dim iConcstr As String Dim iConc As ADODB.Connection '保存文件到数据库中 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 App.Path + "\test.jpg" End With '打开保存文件的表 Set iRe = New ADODB.Recordset With iRe .Open "select * from img", iConc, 1, 3 .AddNew '新增一条记录 .Fields("photo") = iStm.Read .Update End With '完成后关闭对象 iRe.Close iStm.Close End Sub Sub s_ReadFile() Dim iStm As ADODB.Stream Dim iRe As ADODB.Recordset '打开表 Set iRe = New ADODB.Recordset ‘得到最新添加的纪录 iRe.Open "select top 1 * from img order by id desc", iConc, adOpenKeyset, adLockReadOnly '保存到文件 Set iStm = New ADODB.Stream With iStm .Mode = adModeReadWrite .Type = adTypeBinary .Open .Write iRe("photo") ‘这里注意了,如果当前目录下存在test1.jpg,会报一个文件写入失败的错误. .SaveToFile App.Path & "\test1.jpg" End With Image1.Picture = LoadPicture(App.Path & "\test1.jpg") '关闭对象 iRe.Close iStm.Close End Sub Private Sub Command1_Click() Call s_ReadFile End Sub Private Sub Command2_Click() Call s_SaveFile End Sub Private Sub Form_Load() '数据库连接字符串 iConcstr = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False" & _ ";Data Source=F:\csdn_vb\database\保存图片\access图片\img.mdb"‘下面的语句是连接sqlserver数据库的. ‘iConcstr = "Provider=SQLOLEDB.1;Persist Security Info=True;" & _ ‘ "User ID=sa;Password=;Initial Catalog=test;Data Source=yang" Set iConc = New ADODB.Connection iConc.Open iConcstr End Sub Private Sub Form_Unload(Cancel As Integer) iConc.Close Set iConc = Nothing End Sub
也可以用下面函数Public Function ReadbolbToFile(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 ReadbolbToFile = False ChunkSize = 2048 '定义块大小为 2K 'If IsNull(blobColumn) Then Exit Function
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 '零碎数据
ReDim ChunkAry(ChunkSize - 1) '为数据块重新开辟空间 For lngI = 1 To Chunks '循环读出所有块 ChunkAry = blobColumn.GetChunk(ChunkSize) '在数据库中连续读数据块 Put FileNumber, , ChunkAry() '将数据块写入文件中 Next lngI
If Fragment > 0 Then '有零碎数据,则先读该数据 ReDim ChunkAry(Fragment - 1) ChunkAry = blobColumn.GetChunk(Fragment) Put FileNumber, , ChunkAry '写入文件 End If
Close FileNumber '关闭文件 ReadbolbToFile = True Exit Function ErrorHandle: ReadbolbToFile = False MsgBox Err.Description, vbCritical, "读图像数据出错!" End Function
打开vb6,新建工程。添加两个按钮,一个image控件
注意:Access中的photo字段类型为OLE对象.
SqlServer中的photo字段类型为Image'** 引用 Microsoft ActiveX Data Objects 2.5 Library 及以上版本
‘2.5版本以下不支持Stream对象
Dim iConcstr As String
Dim iConc As ADODB.Connection
'保存文件到数据库中
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 App.Path + "\test.jpg"
End With
'打开保存文件的表
Set iRe = New ADODB.Recordset
With iRe
.Open "select * from img", iConc, 1, 3
.AddNew '新增一条记录
.Fields("photo") = iStm.Read
.Update
End With
'完成后关闭对象
iRe.Close
iStm.Close
End Sub
Sub s_ReadFile()
Dim iStm As ADODB.Stream
Dim iRe As ADODB.Recordset
'打开表
Set iRe = New ADODB.Recordset
‘得到最新添加的纪录
iRe.Open "select top 1 * from img order by id desc", iConc, adOpenKeyset, adLockReadOnly
'保存到文件
Set iStm = New ADODB.Stream
With iStm
.Mode = adModeReadWrite
.Type = adTypeBinary
.Open
.Write iRe("photo")
‘这里注意了,如果当前目录下存在test1.jpg,会报一个文件写入失败的错误.
.SaveToFile App.Path & "\test1.jpg"
End With
Image1.Picture = LoadPicture(App.Path & "\test1.jpg")
'关闭对象
iRe.Close
iStm.Close
End Sub
Private Sub Command1_Click()
Call s_ReadFile
End Sub
Private Sub Command2_Click()
Call s_SaveFile
End Sub
Private Sub Form_Load()
'数据库连接字符串
iConcstr = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False" & _
";Data Source=F:\csdn_vb\database\保存图片\access图片\img.mdb"‘下面的语句是连接sqlserver数据库的.
‘iConcstr = "Provider=SQLOLEDB.1;Persist Security Info=True;" & _
‘ "User ID=sa;Password=;Initial Catalog=test;Data Source=yang"
Set iConc = New ADODB.Connection
iConc.Open iConcstr
End Sub
Private Sub Form_Unload(Cancel As Integer)
iConc.Close
Set iConc = Nothing
End Sub
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
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 '零碎数据
ReDim ChunkAry(ChunkSize - 1) '为数据块重新开辟空间
For lngI = 1 To Chunks '循环读出所有块
ChunkAry = blobColumn.GetChunk(ChunkSize) '在数据库中连续读数据块
Put FileNumber, , ChunkAry() '将数据块写入文件中
Next lngI
If Fragment > 0 Then '有零碎数据,则先读该数据
ReDim ChunkAry(Fragment - 1)
ChunkAry = blobColumn.GetChunk(Fragment)
Put FileNumber, , ChunkAry '写入文件
End If
Close FileNumber '关闭文件
ReadbolbToFile = True
Exit Function
ErrorHandle:
ReadbolbToFile = False
MsgBox Err.Description, vbCritical, "读图像数据出错!"
End Function