【问题标题】:Excel VBA Error while inserting image to SQL Server database as varbinary(MAX)将图像作为 varbinary(MAX) 插入 SQL Server 数据库时出现 Excel VBA 错误
【发布时间】:2017-10-18 03:31:30
【问题描述】:

我正在尝试将图像插入到 SQL Server 数据库中,插入到类型为 varbinary(MAX) 的列中;但无论我做什么,我都会收到此错误:

系统错误 &H80040E14 (-2147217900)

我做错了什么?请帮帮我:-( ...

当我在 SQL Server Management Studio 中运行 SQL 语句时,它运行良好。

这是我的代码:

Public Sub ExecuteSQL()
    Dim Conn As ADODB.Connection
    Dim SQL As String
    Dim Connected As Boolean

    DBServer = Sheets("Config").Cells(12, 2).Value
    DBName   = Sheets("Config").Cells(13, 2).Value
    DBUser   = Sheets("Config").Cells(14, 2).Value
    DBPass   = Sheets("Config").Cells(15, 2).Value
    Connected = ConnectToDB(Conn, CStr(DBServer), CStr(DBName), CStr(DBUser), CStr(DBPass))

    SQL =       "INSERT INTO Items (ItemName, Description, Image) "
    SQL = SQL & "VALUES ('Item1', 'This is a test', (SELECT BulkColumn FROM OPENROWSET('C:\Temp\Test.JPG', SINGLE_BLOB) as Rec))"

    RecCount = Query(Conn, SQL, Sheets("SQLResults").Cells(1, 1))
    Conn.Close
    Set Conn = Nothing
End Sub

Function ConnectToDB(Conn As ADODB.Connection, Server As String, Database As String, UserName As String, Password As String) As Boolean
    Set Conn = New ADODB.Connection
    On Error Resume Next
    Conn.ConnectionString = "Provider=SQLOLEDB; Server=" & Server & "; Database=" & Database & ";" & "Uid=" & UserName & ";" & "Pwd=" & Password & ";"
    Conn.Open
    If Conn.State = 0 Then
        ConnectToDB = False
    Else
        ConnectToDB = True
    End If
End Function

Function Query(Conn As ADODB.Connection, SQL As String, RangeToPaste As Range) As Integer
    Dim recordSet As ADODB.recordSet
    Dim Field As ADODB.Field
    Dim Col As Long
    Query = 0
    Set recordSet = New ADODB.recordSet
    recordSet.Open SQL, Conn, adOpenStatic, adLockReadOnly, adCmdText ' <--- Error Here'
    If recordSet.State Then
        Query = recordSet.RecordCount
        RangeToPaste.CopyFromRecordset recordSet
        Set recordSet = Nothing
    End If
End Function

【问题讨论】:

  • 您可以使用您在 SSMS 上使用的确切 SQL 语句来编辑您的帖子吗?也许存在语法问题。 vba 会告诉你哪一行出错了吗?
  • 不是 SQL 服务器人员,但运行数据库的帐户是否有权访问存储 jpg 的文件夹?
  • 我认为@TimWilliams 是正确的。以 0x8 开头的错误代码是访问权限错误。通常这些是由于打开或访问文件的权限不足造成的,但它们可能是由内存访问问题引起的(在这种情况下我认为不太可能)。
  • 如果将图像字段设置为null,插入是否有效?
  • 在 SSMS 上运行良好的 Excat SQL 是:INSERT INTO Items (ItemName,Description,PriceInDollar,Image) VALUES ('Test Item', 'This is a test', 100.00, (SELECT BulkColumn FROM OPENROWSET(BULK 'C:\Temp\Test.JPG', SINGLE_BLOB) as Rec)) 只是为了澄清当我在 SSMS 上运行它时,我使用位于服务器 C:\ 驱动器上的图像,当我使用它时我的 excel 它在我的笔记本电脑 C:\ 驱动器上使用图像,因此访问文件夹或图像无关紧要(这不是问题),是的,当我将图像字段设置为 NULL 时,它可以正常工作。感谢您对这个问题的支持

标签: sql-server vba excel varbinary


【解决方案1】:

好吧,最终是权限问题(谢谢 Tim)我发现为了让 SQL 用户能够运行图像查询(例如插入和编辑),用户应该具有服务器角色:bulkadmin。

  • 在 SSMS 上转到 --> 安全性 --> 登录 --> 双击 SQL 用户
  • 选择服务器角色页面
  • 选中 bulkadmin 复选框。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多