【发布时间】: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