هل يمكنني إرجاع صفيف بايت من عمود خادم SQL Varbinary باستخدام استعلام محدد؟

StackOverflow https://stackoverflow.com/questions/2307830

  •  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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top