| PRB: Error Passing a Blob Argument to a Stored ProcedureID: Q190450 
 | 
When you use the CreateParameter method to pass a Binary Large Object (BLOB) data to a stored procedure you need to specify the Maximum size of the data to be passed. However, when specifying the exact size of blob data the following error is generated when the parameter is actually passed:
Run-time error '3421':
The application is using a value of the wrong type for the current operation.
Add one to the value of Parameter.Size property when passing a BLOB.
In the following example, ImgLen is LOF(<path>\imageFile):
   Set ADOprm = ADOCmd.CreateParameter
   (, adLongVarBinary, adParamInput, (ImgLen + 1)) Microsoft is researching this problem and will post new information here in the Microsoft Knowledge Base as it becomes available.
   CREATE TABLE BLOB_Table
   (
    col1 char(1),
    BLOB image
   )
   GO
   if exists (SELECT * FROM sysobjects WHERE id =
      object_id('dbo.uspInsertBLOB') AND sysstat & 0xf = 4)
      DROP PROCEDURE dbo.uspInsertBLOB
   GO
   CREATE PROCEDURE uspInsertBLOB
   (
    @col1      char (1),
    @BLOB      image
   )
   AS
      INSERT BLOB_Table
      VALUES (@col1, @BLOB)
   GO
 
   Dim ADOCmd As New ADODB.Command
   Dim ADOprm As New ADODB.Parameter
   Dim ADOcon As ADODB.Connection
   Dim intFile As Integer
   Dim ImgBuff() As Byte
   Dim ImgLen As Long
   Set ADOcon = New ADODB.Connection
   With ADOcon
       .Provider = "MSDASQL"
       .CursorLocation = adUseClient
       .ConnectionString = "driver=
           {SQL Server};server=(local);uid=sa;pwd=;database=pubs"
       .Open
   End With
   'Change this to the path of a GIF file you want to use for testing.
   IMG_FILE_GIF = "E:\Graphics\GIF\Image.gif"
   'Read/Store GIF file in ByteArray
    intFile = FreeFile
    Open IMG_FILE_GIF For Binary As #intFile
    ImgLen = LOF(intFile)
    ReDim ImgBuff(ImgLen) As Byte
    Get #intFile, , ImgBuff()
    Close #intFile
    Set ADOCmd.ActiveConnection = ADOcon
    ADOCmd.CommandType = adCmdStoredProc
    ADOCmd.CommandText = "uspInsertBLOB"
    Set ADOprm = ADOCmd.CreateParameter(, adChar, adParamInput, 1, "1")
    ADOCmd.Parameters.Append ADOprm
   'The datatype must be specified as adLongVarBinary
   'For the code to function correctly comment this line.
    Set ADOprm = ADOCmd.CreateParameter(, adLongVarBinary, _
          adParamInput, ImgLen)
    'Uncomment this line.
    'Set ADOprm = ADOCmd.CreateParameter(, adLongVarBinary, _
          adParamInput, (ImgLen + 1))
    ADOCmd.Parameters.Append ADOprm
   'Set the Value of the parameter with the AppendChunk method.
    ADOprm.AppendChunk ImgBuff()
   'The preceding example assumes you are using a small image file.
   'See the article reference in the REFERENCES section for handling a
   'large image file.
    ADOCmd.Execute
    Set ADOCmd = Nothing
    Set ADOprm = Nothing
    Exit Function 
      SELECT * FROM BLOB_Table
 
For additional information, please see the following article in the
Microsoft Knowledge Base:
Q180368 HOWTO: Retrieve and Update a SQL Server Text Field Using ADOMSDN Visual Studio 6.0; search on: "Using Visual InterDev 1.0 to Pass Parameters to and from Microsoft SQL Server Stored Procedures"
Additional query words:
Keywords          : kbADO kbADO150bug kbADO200bug kbDatabase 
Version           : WINDOWS:1.5,2.0
Platform          : WINDOWS 
Issue type        : kbprb Last Reviewed: July 13, 1999