Kann ich mithilfe einer parametrisierten Abfrage ein Byte-Array aus einer SQL Server-VarBinary-Spalte zurückgeben?

Ich habe eine kleine VBA-Prozedur geschrieben, um das Hoch- und Herunterladen von Dateien als Binärdaten in und aus einer VarBinary-Spalte in SQL Server mithilfe von ADO zu testen. Der Upload-Prozess scheint zu funktionieren, aber ich kann den Download-Prozess nicht zum Laufen bringen.

Ich glaube, der Ausgabeparameter für VarBinary ist falsch eingestellt, aber ich kann keine Dokumentation finden, wie man es richtig macht.

Ich erhalte den Laufzeitfehler 3708 "Das Parameterobjekt ist nicht richtig definiert. Es wurden inkonsistente oder unvollständige Informationen bereitgestellt." in der Zeile.Parameters.Append .CreateParameter("@myblob", adVarBinary, adParamOutput)

Aktualisieren: SELECT ? = myblob FROM bin_table WHERE ID = ?; scheint eine binäre Zeichenfolge zurückzugeben, kein binäres Array. Ich glaube, hier liegt das Problem, aber ich weiß immer noch nicht, wie ich es beheben soll.

Aktualisieren: Ich habe den Kompilierungsfehler "Type mismatch: array oder user-defined type expected" durch Hinzufügen behoben.Value bis zum Ende der ZeileWriteFile "C:\some_new_file.pdf", .Parameters("@myblob").

Jede Hilfe wird sehr geschätzt. Vielen Dank!

Private Sub TestReadWriteBlob()

    Dim objConnection As New ADODB.Connection
    Dim objCommand As New ADODB.Command
    Dim objRecordset As New ADODB.Recordset
    Dim intNewID As Integer

    With objConnection
        .CursorLocation = adUseClient
        .ConnectionString = "PROVIDER=SQLOLEDB;Server=<server>;Database=<database>;UID=<uid>;PWD=<pwd>;trusted_connection=false;"
        .Open
    End With

    With objCommand
        .ActiveConnection = objConnection
        .CommandText = "INSERT INTO bin_table ( myblob ) VALUES ( ? ); SELECT ? = id FROM bin_table WHERE ID = @@IDENTITY;"
        .CommandType = adCmdText
        .Parameters.Append .CreateParameter("@myblob", adVarBinary, adParamInput, -1, ReadFile("C:\some_file.pdf"))
        .Parameters.Append .CreateParameter("@NewID", adInteger, adParamOutput)
        .Execute
        intNewID = .Parameters("@NewID")
    End With

    Debug.Print intNewID

    Set objCommand = Nothing
    With objCommand
        .ActiveConnection = objConnection
        .CommandText = "SELECT ? = myblob FROM bin_table WHERE ID = ?;"
        .CommandType = adCmdText
        .Parameters.Append .CreateParameter("@myblob", adVarBinary, adParamOutput)
        .Parameters.Append .CreateParameter("@NewID", adInteger, adParamInput, , intNewID)
        .Execute
        WriteFile "C:\some_new_file.pdf", .Parameters("@myblob").Value
    End With

End Sub

Public Function ReadFile(ByVal strPath As String) As Byte()

    Dim intFile As Integer

    intFile = FreeFile
    Open strPath For Binary Access Read As intFile
    ReDim ReadFile(LOF(intFile) - 1)
    Get intFile, , ReadFile
    Close intFile

End Function

Public Sub WriteFile(ByVal strPath As String, bytBlob() As Byte, Optional ByVal Overwrite As Boolean = True)

    Dim intFile As Integer

    intFile = FreeFile
    If Overwrite And Dir(strPath) <> "" Then
        Kill strPath
    End If
    Open strPath For Binary Access Write As intFile
    Put intFile, , bytBlob
    Close intFile

End Sub

Antworten auf die Frage(1)

Ihre Antwort auf die Frage