使用VBA在参数化查询中查询Excel中的SQL Server

我想使用VBA在Microsoft Excel中查询表格。 我已经写了一些代码来尝试和完成这个任务,但我不断收到运行时错误“1004”说这是一个通用的ODBC错误。 我不知道我需要做什么才能让这个代码正常运行,所以我可以查询这个表。

我正在使用SQL Server Express,即我连接的服务器: .\SQLEXPRESS

数据库:

Databaselink

查询产品表VBA代码:

 Sub ParameterQueryExample() '---creates a ListObject-QueryTable on Sheet1 that uses the value in ' Cell Z1 as the ProductID Parameter for an SQL Query ' Once created, the query will refresh upon changes to Z1. Dim sSQL As String Dim qt As QueryTable Dim rDest As Range '--build connection string-must use ODBC to allow parameters Const sConnect = "ODBC;" & _ "Driver={SQL Server Native Client 10.0};" & _ "Server=.\SQLEXPRESS;" & _ "Database=TSQL2012;" & _ "Trusted_Connection=yes" '--build SQL statement sSQL = "SELECT *" & _ " FROM TSQL2012.Production.Products Products" & _ " WHERE Products.productid = ?;" '--create ListObject and get QueryTable Set rDest = Sheets("Sheet1").Range("A1") rDest.CurrentRegion.Clear 'optional- delete existing table Set qt = rDest.Parent.ListObjects.Add(SourceType:=xlSrcExternal, _ Source:=Array(sConnect), Destination:=rDest).QueryTable '--add Parameter to QueryTable-use Cell Z1 as parameter With qt.Parameters.Add("ProductID", xlParamTypeVarChar) .SetParam xlRange, Sheets("Sheet1").Range("Z1") .RefreshOnChange = True End With '--populate QueryTable With qt .CommandText = sSQL .CommandType = xlCmdSql .AdjustColumnWidth = True 'add any other table properties here .BackgroundQuery = False .Refresh End With Set qt = Nothing Set rDest = Nothing End Sub 

我发现这个堆栈溢出问题与谷歌search。 它看起来并不像任何人试图回答,所以这是我最终做的。 而不是使用“QueryTable”,请按照本MSDN文章中所述使用ADO命令对象。

MSDN示例:

 Dim Conn1 As ADODB.Connection Dim Cmd1 As ADODB.Command Dim Param1 As ADODB.Parameter Dim Rs1 As ADODB.Recordset Dim i As Integer ' Trap any error/exception. On Error Resume Next ' Create and Open Connection Object. Set Conn1 = New ADODB.Connection Conn1.ConnectionString = "DSN=Biblio;UID=admin;PWD=;" Conn1.Open ' Create Command Object. Set Cmd1 = New ADODB.Command Cmd1.ActiveConnection = Conn1 Cmd1.CommandText = "SELECT * FROM Authors WHERE AU_ID < ?" ' Create Parameter Object. Set Param1 = Cmd1.CreateParameter(, adInteger, adParamInput, 5) Param1.Value = 5 Cmd1.Parameters.Append Param1 Set Param1 = Nothing ' Open Recordset Object. Set Rs1 = Cmd1.Execute()