我用VB6和MSSQL来编个程序,相片是image类型。用image控件来加载,并与数据库邦定了。但更新后数据库里并没有存入相片。请问该如何来加载并保存到数据库里?

解决方案 »

  1.   

    使用流对象保存和显示图片 
    打开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
      

  2.   

    往数据库插入图片一般是用ADODB.Stream来做,或者用二进制方式读取文件,然后写入数据库中,请参考:SqlServer中的photo字段类型为ImageDim cn As New ADODB.Connection,rs As New ADODB.Recordset
    Private Sub Form_Load()
        cn.CursorLocation = adUseClient
        '这里给的是sql库的连接,具体的数据库连接请自己改过来    cn.Open "Provider=SQLOLEDB.1;Password=;Persist Security Info=False;User ID=sa;Initial Catalog=Test;Data Source=ljx"
    End SubPrivate Sub cmdSaveFile_Click()
        saveFile App.Path & "\temp.jpg"
    End SubPrivate Sub cmdReadFile_Click()
        readFile App.Path & "\temp1.jpg"
    End Sub'保存文件到数据库
    Private Sub saveFile(Byval strFile As String)
        Dim tmp() As Byte
        Dim lngFile As Long
        If rs.State=adStateOpen Then rs.Close
        rs.Open "select * from test where 1<>1", cn, adOpenDynamic, adLockOptimistic
        
        lngFile = FreeFile
        Open strFile For Binary As #lngFile
        ReDim tmp(LOF(lngFile))
        Get #lngFile, , tmp
        Close #lngFile
        rs.AddNew
        rs.Fields("ID").Value="001"
        rs.Fields("pic").Value = tmp
        rs.Update
    End Sub'读取数据库的文件,保存到硬盘
    Private Sub readFile(Byval strFile As String)
        Dim tmp() As Byte
        If rs.State=adStateOpen Then rs.Close
        rs.Open "select * from test where [ID]='001'", cn
        ReDim tmp(rs.Fields(0).ActualSize)                     '返回2进制文件的字节长度
        tmp = rs.Fields("pic").Value
        Open strFile For Binary As #1
        Put #1, , tmp
        Close #1
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        If rs.State<>adStateClosed Then rs.Close
        If cn.State<>adStateClosed Then cn.Close
        Set rs = Nothing
        Set cn=Nothing
    End Sub
      

  3.   

    谢谢,可没太看明白。
    我用了一个通用对话框来选择相片。
    Private Sub cmdbrowse_Click()
    Set iStm = New ADODB.Stream
    comdia1.ShowOpen
    comdia1.Filter = "所有文件(*.*)|*.*|"
    If comdia1.FileName <> "" Then
        'Image1.Picture = LoadPicture(comdia1.FileName)
        With iStm
            .Type = adTypeBinary   '二进制模式
            .Open
            .LoadFromFile comdia1.FileName
        End With
    End If
    End Sub
    再就在更新过程中加上:Adodc1.Recordset.Fields("相片") = iStm.Read
    请问这样可以吗?那个
    .Write iRe("photo")
    ‘这里注意了,如果当前目录下存在test1.jpg,会报一个文件写入失败的错误.
            .SaveToFile App.Path & "\test1.jpg"
        End With
        Image1.Picture = LoadPicture(App.Path & "\test1.jpg")可不可以不把文件写到文件夹下,直接加载到image控件中?如果可以应该怎样写?问得可能很笨,不太懂,实在不好意思。请多多帮忙,不幸感激!
      

  4.   

    給人回答完了。ADODB.Stream在微軟的網站上有示例代碼的。
      

  5.   

    '//
    '// 保存二进制数据到数据库(如图片、视频等)
    '//
    '// 使用示例:
    '// Rs.AddNew
    '// SaveBinaryDataToDB App.Path & "\" & "img.jpg.", Rs.Fields("ImgFile")
    '// Rs.Update
    '//
    Public Function SaveBinaryDataToDB(surFile As String, fldField As ADODB.Field) As Boolean
        On Error GoTo ErrorHandler
        Dim Strm As ADODB.Stream
     
        Set Strm = New ADODB.Stream
        Strm.Type = 1 ' adTypeBinary==1
        Strm.Open
        Strm.LoadFromFile surFile
        fldField = Strm.Read
        Strm.Close
        Set Strm = Nothing
        
        SaveBinaryDataToDB = True
        
        Exit Function
    ErrorHandler:    SaveBinaryDataToDB = False
        
    End Function'//
    '// 取出二进制数据从数据库(如图片、视频等)
    '//
    '// 使用示例:
    '// GetBinaryDataFromDB App.Path & "\" & "img.jpg.", Rs.Fields("ImgFile")
    '//
    Public Function GetBinaryDataFromDB(dstFile As String, fldField As ADODB.Field) As Boolean
        On Error GoTo ErrorHandler
        Dim Strm As ADODB.Stream    Set Strm = New ADODB.Stream
        Strm.Type = adTypeBinary
        Strm.Open
        Strm.Write fldField
        Strm.SaveToFile dstFile, adSaveCreateOverWrite
        Strm.Close
        Set Strm = Nothing
        
        GetBinaryDataFromDB = True
        
        Exit Function
    ErrorHandler:    GetBinaryDataFromDB = False
        
    End Function