Могу ли я вернуть массив байтов из столбца SQL Server VarBinary с помощью параметризованного запроса?
-
22-09-2019 - |
Вопрос
Я написал небольшую процедуру 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
Решение
Я не смог найти способа вернуть массив байтов из столбца VarBinary в SQL Server с помощью параметра.Однако я понял, что выполнение этого из набора записей работает.Прилагаемый код выполняет свою работу.
Я все еще ищу способ использовать этот параметр для возврата массива байтов и буду ждать ответа в течение нескольких дней, если у кого-то есть решение.
Private Sub TestReadWriteBlob()
Dim objConnection As New ADODB.Connection
Dim objCommand As New ADODB.Command
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:\Users\Thomas\Desktop\some_file.pdf"))
.Parameters.Append .CreateParameter("@NewID", adInteger, adParamOutput)
.Execute
intNewID = .Parameters("@NewID")
End With
Set objCommand = Nothing
With objCommand
.ActiveConnection = objConnection
.CommandText = "SELECT myblob FROM bin_table WHERE ID = ?;"
.CommandType = adCmdText
.Parameters.Append .CreateParameter("@NewID", adInteger, adParamInput, , intNewID)
WriteFile "C:\Users\Thomas\Desktop\blob\some_file.pdf", .Execute.Fields("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