'*************************************************************
'放入常用函数模块中
Public Function SavePicToDB(FileName As String, fld As ADODB.Field) As Boolean
'将图形文件存入数据库
'输入参数:
'fileName:图形文件名称
'fld:存储的字段名称 Dim nLenLeft As Long
 Dim nChunkSize As Long
 Dim mPicFile As Scripting.File
 Dim mFileBuffer() As Byte
 Dim varChunk As Variant
 Dim lFso As New FileSystemObject
 Dim ConChunkSize As Long
 ConChunkSize = 32768
 If fld.Type <> adLongVarBinary Then
   MsgBox "该字段不是用来存储图形,请检查!", vbCritical, "匹配错误"
   SavePicToDB = False
   Exit Function
 End If
 If Not lFso.FileExists(FileName) Then
    MsgBox "不存在该文件!", vbCritical, "文件错误"
    SavePicToDB = False
    Exit Function
 End If
 Set mPicFile = lFso.GetFile(FileName)
 nChunkSize = mPicFile.Size
 ReDim mFileBuffer(nChunkSize - 1)
 
 Open FileName For Binary As #1
 
 Get #1, , mFileBufferfld.AppendChunk mFileBuffer  Close #1
  SavePicToDB = True
End Function

解决方案 »

  1.   

    我希望用存储过程或SQL语句实现,然后在VC中调用
      

  2.   

    '
    '读写二进制数据(流)
    '函数名:AdoStream
    '参数:  M_Conn ADODB连接,TabName 目标数据表,FldName 目标字段,WhereStr 更新条件,
    '       FileName 源文件名或由流生成的文件名,RsStyle 记录集的操作类型.W:File to Recode,R:Recode to File
    '返回值:
    '例:    CALL  AdoStream(P_Cnn,"AchGoods","GdsPhoto","Where gdsid='001'","C:\Tmp.Bmp","W")Public Function AdoStream(M_Conn As ADODB.Connection, _
                              TabName As String, _
                              FldName As String, _
                              Optional WhereStr As String = "", _
                              Optional Filename As String, _
                              Optional RsStyle As SmRsType = RsWrite) As String
        
        Dim StrSql As String
        Dim TmpFileName As String
        Dim Rs As New ADODB.Recordset
        Dim AdoSem As New ADODB.Stream
        Dim ReturnVal As String
        Dim WorkPath As String
        Dim RsType  As Long
        Dim RsStyleStr As String
        
        On Error Resume Next
        
        WorkPath = App.Path
        If Right$(WorkPath, 1) <> "\" Then WorkPath = WorkPath & "\"
        ReturnVal = ""
        AdoSem.Type = adTypeBinary    '流数据类型
        AdoSem.Open                  '打开流
    '/-----------------------------------------------------------
        '将流写入记录集
        RsType = RsStyle
        RsStyleStr = Choose(RsType, "W", "R")
        If RsStyleStr = "W" Then
            If Left$(Trim$(UCase$(WhereStr)), Len("where")) <> UCase$("where") Then WhereStr = " Where " & Trim$(WhereStr)
            StrSql = "Select Top 1 [" & TabName & "].[" & FldName & "] From [" & TabName & "] " & WhereStr
            Set Rs = RsOpen(M_Conn, StrSql, False)  '连接式记录集
            If Not (Rs.EOF And Rs.BOF) Then
                Rs.MoveFirst
                AdoSem.LoadFromFile Filename            '将文件LOAD到流
                DoEvents
                Rs.Fields(FldName).AppendChunk AdoSem.Read
                Rs.Update
            End If
            AdoStream = ""
        ElseIf RsStyle = "R" Then
            '/将流从记录集中取出
            If Len(Trim$(Filename)) = 0 Then Filename = "TmpFile.Bmp"
            If Len(Trim$(Dir$(TmpFileName, vbNormal + vbHidden))) > 0 Then Kill Filename
            If Left$(Trim$(UCase$(WhereStr)), Len("where")) <> UCase$("where") Then WhereStr = " Where " & Trim$(WhereStr)
            
            StrSql = "Select Top 1 [" & TabName & "].[" & FldName & "] From [" & TabName & "] " & WhereStr
            Set Rs = RsOpen(M_Conn, StrSql)
            If Not (Rs.EOF And Rs.BOF) Then
                Rs.MoveFirst
                If Not (IsNull(Rs.Fields(FldName))) Then
                    TmpFileName = WorkPath & Filename
                    AdoSem.Write Rs.Fields(FldName).GetChunk(Rs.Fields(FldName).ActualSize)
                    DoEvents
                    AdoSem.SaveToFile TmpFileName, IIf(Len(Trim$(Dir$(TmpFileName, vbNormal + vbHidden))) > 0, adSaveCreateOverWrite, adSaveCreateNotExist)
                    AdoStream = TmpFileName
                Else
                    AdoStream = ""
                End If
            Else
                AdoStream = ""
            End If
        End If
        AdoSem.Close: Set AdoSem = Nothing
        Rs.Close: Set Rs = Nothing
        Err.Clear
    End Function
      

  3.   

    CREATE TABLE Photos (
    [name] varchar(50),
    [photo] image NULL
    )
    GOCREATE PROCEDURE sp_InsertPhoto
    @name AS VARCHAR(50),
    @image AS IMAGE
    AS
    INSERT INTO Photos ([name],  [photo])
    VALUES (@name, @image)
    GO