Можно ли вернуть байтовый массив из столбца SQL Server VarBinary с помощью параметризованного запроса?

Я написал небольшую процедуру VBA для проверки загрузки и выгрузки файлов в виде двоичных данных в столбец VarBinary в SQL Server и из него с помощью ADO. Процесс загрузки, кажется, работает, но я не могу заставить процесс загрузки работать.

Я считаю, что выходной параметр для VarBinary настроен неправильно, но я не могу найти документацию о том, как это сделать правильно.

Я получаю ошибку во время выполнения 3708 «Объект параметра неправильно определен. Была предоставлена ​​противоречивая или неполная информация». на линии.Parameters.Append .CreateParameter("@myblob", adVarBinary, adParamOutput)

Обновить: SELECT ? = myblob FROM bin_table WHERE ID = ?; кажется, возвращает двоичную строку, а не двоичный массив. Я верю, что именно в этом проблема, но я до сих пор не знаю, как ее исправить.

Обновить: Я исправил ошибку компиляции «Несоответствие типов: ожидаемый массив или пользовательский тип», добавив добавление.Value до конца строкиWriteFile "C:\some_new_file.pdf", .Parameters("@myblob").

Любая помощь очень ценится. Спасибо!

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

Ответы на вопрос(1)

Ваш ответ на вопрос