我可以使用参数化查询从 SQL Server VarBinary 列返回字节数组吗?

2023-12-11

我编写了一个小型 VBA 过程来测试使用 ADO 将文件作为二进制数据上传到 SQL Server 中的 VarBinary 列以及从中下载文件。上传过程似乎可以正常工作,但我无法让下载过程正常工作。

我相信 VarBinary 的输出参数设置不正确,但我找不到任何有关如何正确设置的文档。

我收到运行时错误 3708“参数对象定义不正确。提供的信息不一致或不完整。”在线.Parameters.Append .CreateParameter("@myblob", adVarBinary, adParamOutput)

Update: SELECT ? = myblob FROM bin_table WHERE ID = ?;似乎返回一个二进制字符串,而不是二进制数组。我相信这就是问题所在,但我仍然不知道如何解决它。

Update:我通过添加修复了编译错误“类型不匹配:需要数组或用户定义的类型”.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

我找不到任何方法使用参数从 SQL Server 中的 VarBinary 列返回字节数组。然而,我确实发现从记录集中做到这一点是可行的。附加的代码可以完成这项工作。

我仍在寻找一种使用参数返回字节数组的方法,并且会在几天内坚持接受答案,以防有人有解决方案。

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以使用参数化查询从 SQL Server VarBinary 列返回字节数组吗? 的相关文章

随机推荐

  • 将单选按钮值插入 mysql

    我创建了一个测试表单只是为了尝试将我的单选按钮值发送到 mysql 我现在遇到了问题 下面的代码只是一个测试 我希望单选按钮提交该值 但事实并非如此 table width 300 border 0 align center cellpad
  • Flutter/Dart 中的 SOAP 请求

    我需要使用 Flutter 向 NET Webservice WSDL 发出 SOAP 请求 该网络服务有一个基本的身份验证 用户 密码 和一些带有预定义信封的服务 所以我尝试创建一个 SOAP 信封 String requestBody
  • 多次购买时会发生什么 - 非续订订阅应用内购买

    我正在实现一个包含应用内购买功能的示例 订阅是非续订类型 自动续费订阅时 如果用户已经购买过 且在有效期内再次尝试购买 iTunes会提示 您已经订阅了购买 并且不会进一步进行 用户可以使用应用程序恢复功能恢复其订阅 但对于非续订订阅类型
  • 是否可以在 FullCalendar 中交替行背景颜色?

    我对 fc agenda slot tr 应用了奇数 偶数类 但问题是左 右 单元格 边框位于下面的 fc agenda days 表上 因此当我设置背景时它不会显示在 fc agenda slot tr 上 FullCalendar 本身
  • CakePHP 使用 saveAll:如何使用 HABTM 链接记录保存额外数据?

    我已经能够使用 CakePHP 的 saveAll 方法同时创建 成员 并将它们注册到 事件 中 创建 HABTM 链接记录 这非常棒 例如 此代码创建两个新的 Members 并将每个人的记录添加到 EventsMember 表中 将它们
  • Android 数字选择器对话框 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 有没有人有任何对话框允许用户选择一定范围内的数字 这似乎是一个相当普遍的需求 但我找不到它的通用对话框 而且我不想花时间创建自己的对话框 有什么帮助吗 我知道两年多过去了 但答案仍然
  • ruby 如何允许方法和类同名?

    我碰巧正在用 ruby 开发 Singleton 类 只记得它的工作方式工厂女工 他们解决了这个问题 所以你可以同时使用漫长的路 Factory create and 捷径 Factory 我想了想 很好奇他们是如何上课的Factory也表
  • Cygwin编码困难

    不确定这是否是一个编程问题 我开始怀疑是这样 但后来我在 Windows 控制台而不是 Cygwin 控制台中运行了有问题的 Java 程序 可执行 jar 并且它运行良好 输出重音良好 重音输入接受良好 因此以下内容仅适用于 Cygwin
  • kernel.h中min宏中的“(void)(&_min1 == &_min2)”的作用是什么?

    In kernel h分钟定义为 define min x y typeof x min1 x typeof y min2 y void min1 min2 min1 lt min2 min1 min2 我不明白那条线是什么 void mi
  • 在 SimpleInjector 中使用 IAuthorizationFilter 进行依赖注入

    我有课PermissionFilter实现IAuthorizationFilter from System Web Mvc 由于它具有已映射的依赖项 因此我想使用 SimpleInjector 来提供它 我正在这样做 与 Ninject 合
  • 嵌套 ES6 类?

    似乎可以将类嵌套在构造函数中 然后可以从类中的任何位置实例化 这是官方的吗 编辑 例如 class C constructor class D constructor method var a new D works fine var a
  • 跨域AJAX withCredentials,PHP返回标头内容长度,但没有内容

    我正在尝试从一个域上的页面向另一个域上的 PHP 服务器发送跨域请求 没有凭据 一切都可以正常工作 我需要一个会话 但一旦添加凭据 它就不起作用 这是JS代码 var xhr new XMLHttpRequest xhr open GET
  • 使用 $_GET 字符串传递换行符

    我必须将字符串传递给表单 我想按以下方式混合使用 GET 和 POST
  • ViewBox 内的 WPF TextBox 在调整大小时丢失光标

    我在视图框中有一个文本框 当我尝试调整窗口大小时 文本框大小和字体大小会缩放 但如果我尝试聚焦文本框并尝试使用键盘在文本框中移动光标 有时光标会消失 有没有办法始终显示光标 请参考下面的代码 其中 ViewBox 内有一个 TextBox
  • boost/archive/binary_woarchive.hpp 和/或 boost/archive/binary_wiarchive.hpp 的序列化示例?

    我试图找到一个很好的例子来说明如何使用 boost 序列化内容的这些二进制宽字符版本 我拼凑了一些代码来尝试让它工作 但不幸的是 在尝试编译它时 我遇到了链接器错误 这是我的代码 以防我做任何明显错误的事情 include
  • 处理子例程中重复出现的 VBA 错误

    我被困在我有解决方法的事情上 但这让我烦恼我没有关于如何解决使用问题的直接答案On Error Goto对于重复出现的错误 我的问题本质上是一样的正如这个 但是提供的答案是OP整体方法的替代方案 而不是如何处理具体问题 我在下面简化了一个例
  • 每隔几秒调用获取当前坐标而不使用 NSTimer

    我知道如何用 NSTimer 做到这一点 但我不想每隔几秒就在没有计时器的情况下获取当前的 iPhone 坐标 我无法使用计时器 因为我在应用程序处于后台时获取坐标 我尝试过一些方法 但每秒都会调用一次 而不是每 10 秒调用一次 因为我不
  • CodeIgniter 删除 index.php 不起作用

    我正在使用 Ubuntu 13 并为本地 codeigniter 站点进行以下设置 Apache 2 4 6 Ubuntu 5 5 3 1ubuntu2 2 CI VERSION 2 1 2 如果没有 URL 将不再有效index php
  • 已超出传入消息的最大消息大小配额 (65536)

    我在为几个表创建范围时遇到此异常 所有这些表在设计上都很大
  • 我可以使用参数化查询从 SQL Server VarBinary 列返回字节数组吗?

    我编写了一个小型 VBA 过程来测试使用 ADO 将文件作为二进制数据上传到 SQL Server 中的 VarBinary 列以及从中下载文件 上传过程似乎可以正常工作 但我无法让下载过程正常工作 我相信 VarBinary 的输出参数设