现在我从新建了一个工程,就一个写入图片的功能,但还是不行,我真的很郁闷.
 返回的错误是:多步OLE DB操作产生错误,请检查每个OLE DB状态值.没有工作被完成.
 各位大侠帮忙看看我的代码有什么错误?(在mysql数据库中photo字段的数据类型为LONGBLOB.) 
Option Explicit
Dim cn As New ADODB.Connection
Dim adors As New ADODB.RecordsetPrivate Sub Command1_Click()
On Error GoTo Errhandle
Dim stmCon As New Stream
CommonDialog1.DialogTitle = "图片资料"
CommonDialog1.Filter = "图片文件(*.JPG;*.bmp;*.gif)|*.JPG;*.bmp;*.gif|所有文件(*.*)|*.*"
CommonDialog1.InitDir = "D:\q\zx"
CommonDialog1.Action = 1
Image1.Picture = LoadPicture(CommonDialog1.FileName)
stmCon.Type = adTypeBinary
stmCon.Open
stmCon.LoadFromFile CommonDialog1.FileName
If adors.State = adStateOpen Then adors.Close
adors.Open "SELECT * FROM admin where name='guest'", cn, adOpenDynamic, adLockOptimistic
adors.Fields("photo").Value = stmCon.Read
adors.Update
stmCon.Close
Set stmCon = Nothing
Errhandle:
    MsgBox Err.Description, vbExclamation
End SubPrivate Sub Command2_Click()
Unload Me
End SubPrivate Sub Form_Load()
cn.ConnectionString = "DSN=cqh;UID=root;PWD="
cn.Open
End Sub

解决方案 »

  1.   

    我说兄弟,我给你的代码我是测试好的,已经能够保存成功,并且也能够取出来显示在IMAGE控件中。你怎么不好用呢!?~~~
      

  2.   

    我在中间加了下面两句,可以改变数据库中相应的数值
    str = "update admin set passwd='qqqqqq' where name='guest'"
    cn.Execute str
      

  3.   

    好好调试下,看看CommonDialog1.FileName的值??
    Private Sub Command1_Click()
        Dim stmCon As New Stream
        stmCon.Type = adTypeBinary
        stmCon.Open
        stmCon.LoadFromFile App.Path & "\流川枫.gif"
        If rs.State = adStateOpen Then rs.Close
        rs.Open "SELECT * FROM img", cn, adOpenDynamic, adLockOptimistic
        rs.AddNew
        rs!ID = "3"
    '    rs!Name = "11"
        rs.Fields("PHOTO").Value = stmCon.Read
        rs.Update
        stmCon.Close
        Set stmCon = Nothing
    End Sub
      

  4.   

    to cuizm(射天狼) 
    大哥,我也觉得奇怪呀.您看一下,和您给我的代码差不多吧?它就存不进去,您说奇怪不奇怪.其他的字段又可以进行操作,就是LONGBLOB类型的字段不可以,很郁闷.
      

  5.   


    给你一个微软自带例子吧,不过这个方法有些旧,如果使用ADODB.Stream 可能效果更好些
                                    想要:give me Email :[email protected]
    Dim cn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Private Sub Form_Load()
        On Error GoTo ErrHandler:
        
        Dim UserName As String
        Dim Password As String
        Dim ServerName As String
        Dim DBName As String
        
        UserName = ""
        Password = ""
        ServerName = ""
        DBName = "Northwind"
        
        ' Set connection properties.
        cn.ConnectionTimeout = 25                                       ' Set the time out.
        cn.Provider = "sqloledb"                                        ' Specify the OLE DB provider.
        cn.Properties("Data Source").Value = ServerName                 ' Set SQLOLEDB connection properties.
        cn.Properties("Initial Catalog").Value = DBName                 ' Set SQLOLEDB connection properties.
        cn.Properties("Integrated Security").Value = "SSPI"             ' Set SQLOLEDB connection properties.
        Screen.MousePointer = vbHourglass
            cn.Open
        Set rs = New ADODB.Recordset
        rs.Open "select * from Employees", cn, adOpenKeyset, adLockPessimistic
            rs.MoveFirst
        FillDataFields
        Screen.MousePointer = vbDefault
        Exit Sub
    ErrHandler:
          Screen.MousePointer = vbDefault
           MsgBox Err.Description, , "Error "
         End
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
        If rs.State = adStateOpen Then
            rs.Close
        End If
        If cn.State = adStateOpen Then
          cn.Close
        End If
        End
    End Sub
    Private Function FillDataFields()
        On Error GoTo ErrHandler:
        Dim fld As ADODB.Field
        Dim byteChunk() As Byte
        Dim strNote As String
        Dim Offset As Long
        Dim Totalsize As Long
        Dim Remainder As Long
        Dim NumOfChuncks As Long
        Dim CurrentRecPos As Long
        Dim FieldSize As Long
        Dim FileNumber As Integer
        Const HeaderSize As Long = 78
        Const ChunkSize As Long = 100
        Const TempFile As String = "tempfile.tmp"
        txtEID.Text = ""
        txtLastName.Text = ""
        txtFirstName.Text = ""
        txtTitle.Text = ""
        txtCTitle.Text = ""
        txtBirthDate.Text = ""
        txtHireDate.Text = ""
        txtAddress.Text = ""
        txtCity.Text = ""
        txtRegion.Text = ""
        txtZipCode.Text = ""
        txtCountry.Text = ""
        txtHomePhone.Text = ""
        txtExtension.Text = ""
        txtNotes.Text = ""
        txtReportsTo.Text = ""
        Image1.Picture = Nothing
        lblName.Caption = ""
        txtRecCnt = ""        
        Set Flds = rs.Fields
        txtRecCnt = Str(rs.AbsolutePosition) + " of " + Str(rs.RecordCount)
        CurrentRecPos = rs.AbsolutePosition
        For Each fld In Flds
            FieldSize = fld.ActualSize
            If FieldSize > 0 Then                                 ' Rule out the none possibility.
                Select Case fld.Name
                    Case "EmployeeID"
                        txtEID.Text = Str(fld.Value)
                    Case "LastName"
                        txtLastName.Text = fld.Value
                    Case "FirstName"
                        txtFirstName.Text = fld.Value
                    Case "Title"
                        txtTitle.Text = fld.Value
                    Case "TitleOfCourtesy"
                        txtCTitle.Text = fld.Value
                    Case "BirthDate"
                        txtBirthDate.Text = Str(fld.Value)
                    Case "HireDate"
                        txtHireDate.Text = Str(fld.Value)
                    Case "Address"
                        txtAddress.Text = fld.Value
                    Case "City"
                        txtCity.Text = fld.Value
                    Case "Region"
                        txtRegion.Text = fld.Value
                    Case "PostalCode"
                        txtZipCode.Text = fld.Value
                    Case "Country"
                        txtCountry.Text = fld.Value
                    Case "HomePhone"
                        txtHomePhone.Text = fld.Value
                    Case "Extension"
                        txtExtension.Text = fld.Value
                    Case "Photo"
                        FileNumber = FreeFile
                        Open TempFile For Binary Access Write As FileNumber
                        Totalsize = FieldSize - HeaderSize          ' Substract it from the total size.
                        byteChunk() = fld.GetChunk(HeaderSize)      ' Get rid of the header.
                        NumOfChuncks = Totalsize \ ChunkSize
                        Remainder = Totalsize Mod ChunkSize
                        If Remainder > 0 Then
                            byteChunk() = fld.GetChunk(Remainder)
                            Put FileNumber, , byteChunk()
                        End If
                        Offset = Remainder
                        Do While Offset < Totalsize
                            byteChunk() = fld.GetChunk(ChunkSize)
                            Put FileNumber, , byteChunk()
                            Offset = Offset + ChunkSize
                        Loop
                        Close FileNumber
                        Image1.Picture = LoadPicture(TempFile)
                        Kill (TempFile)
                    Case "Notes"
                        Totalsize = FieldSize / 2                   ' Becuase of being WChar
                        NumOfChuncks = Totalsize \ ChunkSize
                        Remainder = Totalsize Mod ChunkSize
                        If Remainder > 0 Then
                            strNote = fld.GetChunk(Remainder)
                        End If
                        Offset = Remainder
                        Do While Offset < Totalsize
                            strNote = strNote + fld.GetChunk(ChunkSize)
                            Offset = Offset + ChunkSize
                        Loop
                        txtNotes.Text = strNote
                    Case "ReportsTo"
                        Dim FindString As String
                        FindString = "EmployeeID = " + Str(fld.Value)
                        rs.MoveFirst                                    ' Move to the first record to ensure a search for the whole records.
                        rs.Find FindString, 1, adSearchForward          ' Search for the whole records.
                        If rs.EOF = False Then                          ' Did find the match.
                            txtReportsTo.Text = rs!firstname + " " + rs!LastName
                        End If
                        rs.Move (CurrentRecPos - rs.AbsolutePosition)   ' Move back to the record before the search.
                End Select
            End If
        Next
        
        ' Display employee name.
        lblName.Caption = txtFirstName.Text + "  " + txtLastName.Text
        
        Exit Function
    ErrHandler:
        MsgBox Err.Description, , "Error "
    End Function
    Private Sub TabStrip1_Click()
        Picture1(TabStrip1.SelectedItem.Index - 1).ZOrder 0
    End Sub
    Private Sub btnFirst_Click()
        If rs.BOF = False Then
            rs.MoveFirst
        End If
        If rs.BOF = False Then
            FillDataFields
        End If
    End SubPrivate Sub btnPrevious_Click()
        If rs.BOF = False Then
            If rs.EOF = True Then
                 rs.MoveLast
            End If
            rs.MovePrevious
        End If
        If rs.BOF = False Then
            FillDataFields
        End If
    End SubPrivate Sub btnNext_Click()
        If rs.EOF = False Then
            If rs.BOF = True Then
                 rs.MoveFirst
            End If
            rs.MoveNext
        End If
        If rs.EOF = False Then
            FillDataFields
        End If
    End SubPrivate Sub btnLast_Click()
        If rs.EOF = False Then
            rs.MoveLast
        End If
        If rs.EOF = False Then
            FillDataFields
        End If
    End Sub
      

  6.   

    我新建了一个数据库之后也遇到了你说的这个错误,我用PB的数据库窗口向表中插入一条新记录(照片字段必须插入值,否则不行),然后再用VB添加就没问题了,可能是MYSQL的原因,或者需要初始化什么东西,不得其法!我再想想办法!!
      

  7.   

    jone999(勋之梦) 
    CommonDialog1.FileName的值是正确的,没错误.并且stmCon.Read中也有值.只是好象不多,因为是二进制,显示乱码.
      

  8.   

    在这里先感谢cuizm(射天狼) 大哥和楼上帮我的各位大哥了.
      

  9.   

    MYSQL 数据实在是麻烦,可以不用它吗?~~~~不支持事务处理,突然断电数据库损坏,数据丢失,总之问题一大堆,为什么非得用它呢!!!!
    换了吧!!!
      

  10.   

    to cuizm(射天狼) :
    因为以前的软件用的是mysql数据库,我只是在以前开发的软件上增加一些功能,也就是升级吧.若换数据库,很麻烦的,以前的数据不好倒.若是新开发,我才不会选择这种破数据库呢.
      

  11.   

    我刚才用cuizm(射天狼) 大哥的方法:新建了一个数据库,有三个字段:id(varchar 11),name(varchar 8),image(longblob)并且用其他第三方软件添加了一条记录(包括LONGBLOB),用于测试,用VB写的程序还是不能添加.也就是用
    adors.Open "SELECT * FROM pic ", cn, adOpenDynamic, adLockPessimistic
    adors.AddNew
    adors!id = "2"
    adors!name = "qh"
    adors.Fields("iamge").Value = stmCon.Read
    adors.Update
    stmCon.Close
    Set stmCon = Nothing
    这种方式不行.始终弹出上面所说的错误:多步OLE DB操作产生错误,请检查每个OLE DB状态值.没有工作被完成.

    str = "update pic set name='" & Text1.Text & "' where id='1'"
    cn.Execute str
    这种方式却可以更改数据库中相应字段的值,当然LONGBLOB数据类型的字段不行.
      

  12.   


    adors.Open "SELECT * FROM pic ", cn, adOpenDynamic, adLockPessimistic
    adors.AddNew
    adors!id = "2"
    adors!name = "qh"
    'adors.Fields("iamge").Value = stmCon.Read注释掉
    adors.Update
    stmCon.Close
    Set stmCon = Nothing
    也不能添加记录,弹出相同的错误,是不是这种方式还需要设置什么东西?各位大哥
      

  13.   


    adors.Open "SELECT * FROM pic ", cn, adOpenDynamic, adLockPessimistic
    adors.AddNew
    adors!id = "2"
    adors!name = "qh"
    'adors.Fields("iamge").Value = stmCon.Read注释掉
    adors.Update
    stmCon.Close
    Set stmCon = Nothing
    也不能添加记录,弹出相同的错误,是不是这种方式还需要设置什么东西?各位大哥
    ////////////
    cn.CursorLocation = adUseClient
    就可以添加了!!!
      

  14.   

    我用下面的语句能读出数据库中LONGBLOB数据类型的值并可显示(其他数据类型的值也能正确显示):
    Dim stmCon As New Stream
        
    If adors.State = adStateOpen Then adors.Close
      adors.Open "SELECT * FROM pic", cn, adOpenForwardOnly, adLockReadOnly
      Text1.Text = adors.Fields("id").Value
      Text2.Text = adors.Fields("xname").Value
      If Not adors.EOF Then
       stmCon.Type = adTypeBinary
       stmCon.Open
       stmCon.Write (adors.Fields("iamge").Value)
       stmCon.SaveToFile "d:\aaqh.jpg", adSaveCreateOverWrite
        End If
        Image1.Picture = LoadPicture("d:\aaqh.jpg")
    但是用下面的语句,就不能向数据库中写入记录了(任何类型):
    adors.Open "SELECT * FROM pic ", cn, adOpenStatic, adLockOptimistic
    adors.AddNew
    adors.Fields("id").Value = "2"
    adors.Fields("xname") = "qh"
    'adors.Fields("iamge").Value = stmCon.Read
    adors.Update
    stmCon.Close
    Set stmCon = Nothing
    无论包不包括图片类型的数据,都不行.
      

  15.   

    to cuizm(射天狼) 大哥:
     我添加了cn.CursorLocation = adUseClient这一句
    用下面的语句进行连接数据库:
    cn.ConnectionString = "DSN=qt1;UID=root;PWD="
    cn.CursorLocation = adUseClient
    cn.Open
    然后用下面的语句写数据库:
    Dim stmCon As New Stream
    Dim str As String
    CommonDialog1.DialogTitle = "图片资料"
    CommonDialog1.Filter = "图片文件(*.JPG;*.bmp;*.gif)|*.JPG;*.bmp;*.gif|所有文件(*.*)|*.*"
    CommonDialog1.InitDir = "D:\"
    CommonDialog1.Action = 1
    Image1.Picture = LoadPicture(CommonDialog1.FileName)
    stmCon.Type = adTypeBinary
    stmCon.Open
    stmCon.LoadFromFile CommonDialog1.FileName
    If adors.State = adStateOpen Then adors.Close
    adors.Open "SELECT * FROM pic ", cn, adOpenStatic, adLockOptimistic
    adors.AddNew
    adors.Fields("id").Value = "2"
    adors.Fields("xname").Value = "qh"
    'adors!id = "2"
    'adors!xname = "qh"
    adors.Fields("iamge").Value = stmCon.Read
    adors.Update
    stmCon.Close
    Set stmCon = Nothing
    还是有错,错误是:多步操作产生错误.请检查每一步的状态值.各位大哥:
    麻烦各位大哥,有谁知道怎么检查每一步的状态值啊?这到底是什么原因引起的呀?他们用PHP的,直接用SQL语句就可以将图片存入mysql数据库(当然用一个什么函数addslashes将图片转换了一下)怎么用VB这么麻烦啊?真郁闷
      

  16.   

    我用PB的数据窗口插入一条记录之后(包含图片字段数据),再用VB插入值就一点问题也没有了,我也不知道为什么了,真晕~~~~~~~
      

  17.   

    to cuizm(射天狼) 大哥:
     您就是用的您给我的代码吗?我用的是VB6中文企业版.以前没有用它查入过图片,只插入过其他数据类型的记录(同SQL语句,没用过流stream形式),能正常操作啊,哪知用流(stream)形式就...哎一言难尽啊.各位大哥:
     救救我啊!!!!!!!!!!!!!!!!!!!!!!!!
      

  18.   

    对啊,我给你的代码向别的数据库中插入图片一点问题没有!!只有MYSQL不行!!
    并且关键的问题是PB插入数据之后,如果这条数据不删除,再用VB插入数据就没问题了,如果你很急的话,就只有先用PB插入一条记录了,这也是一个"不是办法"的办法了~~~~~等找到解决问题的办法再改,呵呵~~~~~我查遍GOOGLE也没有找到办法,郁闷;((((((((((
      

  19.   

    我用SQLyog(管理mysql数据库的软件)插入一条记录(id 1,xname aaaaa,iamge 3948字节.)后,用下面的语句写数据库,还是写不进去:
    dors.Open "SELECT * FROM pic ", cn, adOpenStatic, adLockOptimistic
    adors.AddNew
    'adors.Fields("id").Value = "2"
    'adors.Fields("xname").Value = "qh"
    adors!id = "2"
    adors!xname = "qh"
    adors.Fields("iamge").Value = stmCon.Read
    adors.Update
    用SQL语句则能写入(不包括LONGBLOB类型字段):
    str = "insert into pic (id,xname) values('2','qqqh')"
    cn.Execute str
    一定要用PB插入数据吗?用其他软件不行?为什么要用PB?PB好象也是一种开发语言吧?我没用过,一点都不熟悉,怎样插入记录啊?
      

  20.   

    用上面的代码,向sql server中添加记录,一点问题都没有,就是不能向mysql中添加.现在可以确定是mysql数据库的原因了,不知哪位大侠熟悉mysql数据库,是不是需要配置什么东西?我用我们公司其他同事的mysql数据库,也不行,他们也不知是什么原因.求求各位大哥:救救我.
      

  21.   

    PB就是POWER BUILDER,也是一种语言,我怀疑可能是MYSQL数据库存大容量数据需要缓冲区,如果数据库是空的,直接用VB插入值,好像开辟不了缓冲区,用PB插完之后缓冲区就会打开.不过不知道用VB怎么打开这个缓冲区!!
      

  22.   

    现在我用PHP先插入一条记录,再用上面的语句查入,仍然不行.取出显示一直都可以.
      

  23.   

    各位大侠,问题还是未解决.有什么新发现吗?写入mysql数据库就是不行,access,sql server,oracle等数据库读写都没问题.mysql数据库到底有什么奥秘呀?各位大侠帮忙想想,小弟在这先谢了.