怎样在SQL数据库中存、取图片!我没有用OLE 控件,请指教!谢

解决方案 »

  1.   

    使用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控件显示图像
      ......
      

  2.   

    给你这个模块里面的两个函数,一个是写图片到数据库,一个是读出来,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]
      

  3.   

    可以用 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
      

  4.   

    *************************************************************************
    '**
    '** 使用 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
      

  5.   

    '存储照片文件到数据库
    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