现在我从新建了一个工程,就一个写入图片的功能,但还是不行,我真的很郁闷.
返回的错误是:多步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
返回的错误是:多步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
str = "update admin set passwd='qqqqqq' where name='guest'"
cn.Execute str
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
大哥,我也觉得奇怪呀.您看一下,和您给我的代码差不多吧?它就存不进去,您说奇怪不奇怪.其他的字段又可以进行操作,就是LONGBLOB类型的字段不可以,很郁闷.
给你一个微软自带例子吧,不过这个方法有些旧,如果使用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
CommonDialog1.FileName的值是正确的,没错误.并且stmCon.Read中也有值.只是好象不多,因为是二进制,显示乱码.
换了吧!!!
因为以前的软件用的是mysql数据库,我只是在以前开发的软件上增加一些功能,也就是升级吧.若换数据库,很麻烦的,以前的数据不好倒.若是新开发,我才不会选择这种破数据库呢.
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数据类型的字段不行.
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
也不能添加记录,弹出相同的错误,是不是这种方式还需要设置什么东西?各位大哥
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
就可以添加了!!!
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
无论包不包括图片类型的数据,都不行.
我添加了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这么麻烦啊?真郁闷
您就是用的您给我的代码吗?我用的是VB6中文企业版.以前没有用它查入过图片,只插入过其他数据类型的记录(同SQL语句,没用过流stream形式),能正常操作啊,哪知用流(stream)形式就...哎一言难尽啊.各位大哥:
救救我啊!!!!!!!!!!!!!!!!!!!!!!!!
并且关键的问题是PB插入数据之后,如果这条数据不删除,再用VB插入数据就没问题了,如果你很急的话,就只有先用PB插入一条记录了,这也是一个"不是办法"的办法了~~~~~等找到解决问题的办法再改,呵呵~~~~~我查遍GOOGLE也没有找到办法,郁闷;((((((((((
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好象也是一种开发语言吧?我没用过,一点都不熟悉,怎样插入记录啊?