Why do I get the error "Multiple-step OLE DB operation generated errors" when using Microsoft ActiveX Data Objects (ADO) to write to BLOB
s. What can I do?
This article provides a workaround if you're using either the Easysoft InterBase ODBC driver or the Easysoft Firebird ODBC driver to write to BLOB
s from ADO and get the following error:
Run-time error '2147217887 (80040e21):' Multiple-step OLE DB operation generated errors. Check each OLE DB status value, if available. No work was done.
To reproduce this error:
- Create the following table:
CREATE TABLE "BLBCHECK" ( "KY" INTEGER NOT NULL, "BLB" BLOB SUB_TYPE 1, PRIMARY KEY ("KY") );
- Using Microsoft Visual Basic or Visual Basic for Applications (VBA), add a reference to
Microsoft ActiveX Data Objects 2.5+
. - Run the following code:
Dim con As New ADODB.Connection Dim rs As New ADODB.Recordset con.Open "DSN=IB" rs.Open "select * from blbcheck", con, adOpenDynamicm, _ adLockOptimistic rs.AddNew rs.Fields(0) = 21 rs.Fields(1) = "1" rs.Update rs.Close con.Close
The error occurs when you try to INSERT
"1" into Fields(1)
. To work around this problem, use the AppendChunk
method to append the data instead.
Dim conADO As New ADODB.Connection
Dim cmdADO As New ADODB.Command
Dim prmText As New ADODB.Parameter
Dim strSQL As String
Dim strText As Variant
Dim lngTrxNo As Long
Dim lngOccurNo As Long
Dim lngSeq As Long
Dim intChar As Integer
Const conChunkSize = 100
lngTrxNo = 1
lngOccurNo = 1
lngSeq = 13
strSQL = "insert into blbcheck ( ky, blb ) values ( 100, ? )"
' To prove this works, we will insert 2500 characters,
' with a linefeed on every 100th character.
strText = ""
For intChar = 1 To 2500
strText = strText & "A"
If intchr = 100 Then
strText = strText & Chr(10)
End If
Next
'-------------------------------------------------------'
' Connect to the data source.
'-------------------------------------------------------'
conADO.Open "DSN=IBv4"
'-------------------------------------------------------'
' Once connected, prepare the SQL statement.
'-------------------------------------------------------'
cmdADO.ActiveConnection = conADO
cmdADO.CommandText = strSQL
Set prmText = cmdADO.CreateParameter("blb", adLongVarChar, _
adParamInput, Len(strText), "")
If lngSize = 0 Then
lngSize = Len(strText)
End If
lngOffset = 0
'-------------------------------------------------------'
' Insert the bound parameter a bit at a time.
'-------------------------------------------------------'
Do While lngOffset < lngSize
varChunk = Left(Right(strText, lngSize - lngOffset), conChunkSize)
prmText.AppendChunk varChunk
lngOffset = lngOffset + conChunkSize
Loop
cmdADO.Parameters.Append prmText
'-------------------------------------------------------'
' Execute the query.
'-------------------------------------------------------'
cmdADO.Execute
conADO.Close
Use the AppendChunk
method on a Field
or Parameter object
to fill it with long binary or character data. In situations where system memory is limited, you can use the AppendChunk
method to manipulate long values in parts rather than in their entirety.