Excel VBA - 基于范围从SQL获取数据 - 自动化错误

时间:2017-07-31 10:53:45

标签: excel vba excel-vba

当运行以下代码时,我不断收到自动化错误,对于我的生活,我无法弄清楚原因。任何人都能解释一下吗?

当我使用调试时,它会突出显示以下内容;

    rs.Open SQLStr, cn

我看到了一些

的引用

我的任务是根据第A列第3行中的值从SQL DB获取数据。

Excel表格示例:

ITEM   | QTY TO PICK | QTY ON ORDER | Column 2 | Column 3 etc

PART 1 |      5      | <Data will be populated here>

PART 2 |      12     | <Data will be populated here>

此代码通过命令按钮运行。

从C3开始填充从SQL中提取的数据。

Private Sub CommandButton2_Click()

' Create a connection object.
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection

' Provide the connection string.
Dim strConn As String

'Use the SQL Server OLE DB Provider.
strConn = "Provider=SQLOLEDB;"

'Connect to the Pubs database on the local server.
strConn = strConn & "server=<server name>;INITIAL CATALOG=<DB Name>;"

'Use an integrated login.
strConn = strConn & " INTEGRATED SECURITY=sspi;"

'Now open the connection.
cn.Open strConn

'
'

ActiveSheet.Range("C3:G10000").Clear ' clear out existing data
Dim ItemNumber As String

ItemNumber = Range("A3").Value

' Create a recordset object.
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset

SQLStr = "Select * from vw_WorksOrder WHERE ITEMNO = " & ItemNumber & ""

rs.Open SQLStr, cn

' Copy the records into cell A1 on Sheet1.
Sheet4.Range("C3").CopyFromRecordset rs

' Tidy up

rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing

1 个答案:

答案 0 :(得分:0)

由于@Zac指出错误使用解决问题的引号,因此请考虑使用行业最佳参数化实践来完全不使用引号或变量串联。 ADO可以使用其Command CreateParameter方法参数化SQL调用。

请参阅下面的示例使用您的设置,其中?在预准备语句中用作占位符,然后附加一个参数,用于定义其名称,类型,方向大小,

...
Dim cmd As New ADODB.Command

With cmd
    .ActiveConnection = cn
    .CommandText = "SELECT * FROM vw_WorksOrder WHERE ITEMNO = ?"
    .CommandType = adCmdText
    .Parameters.Append cmd.CreateParameter("itemparam", adVarChar, adParamInput, 255, ItemNumber)
End With

Dim rs As New ADODB.Recordset
Set rst = cmd.Execute
...

另外,另一个行业最佳实践是运行时错误的错误和异常处理,因为 AutomationError 对调试没有用。并且您想要释放所有Set个对象而不管错误与否。在VBA中,您可以使用On Error处理来输出更多有用的消息,并相应地从内存中释放对象。

Private Sub CommandButton2_Click()
On Error Goto ErrHandle
  '...same code but without any Set obj = Nothing (since used in ExitHandle)

ExitHandle:
  Set rs = Nothing
  Set cmd = Nothing
  Set cn = Nothing
  Exit Sub

ErrHandle:
  Msgbox Err.Number & " - " & Err.Description
  Resume ExitHandle

End Sub