SQL 查询在 Excel 中不起作用,但在 Access 中起作用
Posted
技术标签:
【中文标题】SQL 查询在 Excel 中不起作用,但在 Access 中起作用【英文标题】:SQL query does not work in Excel but works in Access 【发布时间】:2021-12-30 21:47:14 【问题描述】:对于下面列出的代码,除了第一个 SQL 查询外,它运行良好。我正在从工作簿中提取地址和状态信息,并对信息运行查询以查找地址出现在表中的次数。如果我在查询发送到 Access 之前运行代码并停止它,我可以从立即窗口中提取查询命令,转到 Access,然后运行查询没有问题。但是,如果我只是运行 VBA 程序并让它将查询发送到 Access,我会一直得到 0 的结果。长话短说,查询将在 Access 中运行并提供正确的结果,但是当 Excel VBA 将查询发送到 Access 时,我的结果一直为零(并且没有错误消息)。任何帮助将不胜感激。
Dim DatabaseFileName As String, connectionstring As String
connectionstring = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & DatabaseFileName & "; Persist Security Info=False;"
Dim conn As New ADODB.Connection
conn.Open connectionstring
Dim rs As New ADODB.Recordset, SQL As String
Dim ExecSQL As New ADODB.Command
With ThisWorkbook.Sheets(1)
For I = 2 To 1235
SQL = ""
If .Cells(I, 7) <> "" Then
SQL = "SELECT Count(VRSC_CUSTOMER_SITES.SITE_ID) AS GCOUNT into [GVRCount1] "
SQL = SQL & "FROM (VRSC_CUSTOMER_SITES) "
SQL = SQL & "WHERE ((VRSC_CUSTOMER_SITES.SITE_STREET Like " & Chr(34) & .Cells(I, 7) & Chr(34) & ") AND ((VRSC_CUSTOMER_SITES.SITE_ST)="
SQL = SQL & Chr(34) & .Cells(I, 5) & Chr(34) & ") AND ((VRSC_CUSTOMER_SITES.SITE_PHONE) Not Like ""999*""));"
rs.Open SQL, conn
SQL = "SELECT * FROM [GVRCount1]"
rs.Open SQL
.Cells(I, 8).CopyFromRecordset rs
End If
Next
End With
With ThisWorkbook.Sheets(2)
.Range("A1").CopyFromRecordset rs
End With
conn.Close
End Sub
【问题讨论】:
为什么第一次打开rs?打开第二个查询时,您不会使用它并立即将其丢弃。对我来说毫无意义。 是的,你是对的。所以请忽略那部分。我已经删除了“SQL =”SELECT * FROM [GVRCount1]”和“rs.Open SQL”部分。所以我基本上只是在看 SQL 的东西。我仍然遇到同样的问题。 我以前必须通过 ADODB 对 SQL 进行故障排除,因此我建议先从SELECT * FROM [VRSC_CUSTOMER_SITES$]
之类的“不失败”SQL 语句开始,看看它是 SQL 还是您的连接。如果可行,我将注释掉并逐行测试您更复杂的 SQL 语句,取消注释(进行修改以使其仍然有效)。我从来没有查询过 MS-Access,但是当我编写 SQL 查询以针对 Excel 工作簿(用作数据库)时,我的 SQL 表写为:[Table$]
,“$”在结尾。仔细检查?
【参考方案1】:
本质上,问题是由LIKE
运算符引起的。每当您通过 ODBC/OLEDB 连接运行 Access 查询时,要使用的通配符是当前的 ANSI 版本 %
。但是,在 Access GUI 中,通配符使用旧版本 *
。请参阅 MSDN docs 讨论此通配符用法。
为了在 Excel 和 Access(VBA 或 GUI)之间兼容,请考虑将未记录的 ALIKE
运算符仅使用 %
。此外,使用 ADO 命令使用 ADO 参数化并避免将值连接到 SQL 语句。下面将第一个LIKE
替换为=
,因为没有使用通配符并且使用INTO
的生成表操作已被删除。此外,New
已从任何 Dim
行中删除。
Dim DatabaseFileName As String, connectionstring As String, SQL As String
Dim conn As ADODB.Connection, rs As ADODB.Recordset, ExecSQL As ADODB.Command
Dim I As Long
connectionstring = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" _
& DatabaseFileName & "; Persist Security Info=False;"
Set conn = New ADODB.Connection
conn.Open connectionstring
' PREPARED STATEMENT WITH ? PLACEHOLDERS
SQL = "SELECT COUNT(v.SITE_ID) AS GCOUNT " _
& "FROM VRSC_CUSTOMER_SITES v " _
& "WHERE v.SITE_STREET = ? " _
& " AND v.SITE_ST = ? " _
& " AND v.SITE_PHONE NOT ALIKE '999%';" _
For I = 2 To 1235
If ThisWorkbook.Sheets(1).Cells(I, 7) <> "" Then
Set ExecSQL = New ADODB.Command
With ExecSQL
.ActiveConnection = conn
.CommandText = SQL
.CommandType = adCmdText
' BIND PARAMETERS
.Parameters.Append .CreateParameter("street_param", adVarchar, adParamInput, 255, ThisWorkbook.Sheets(1).Cells(I, 7))
.Parameters.Append .CreateParameter("st_param", adVarchar, adParamInput, 255, ThisWorkbook.Sheets(1).Cells(I, 5))
' EXECUTE QUERY AND BIND INTO RECORDSET
Set rs = .Execute
End With
ThisWorkbook.Sheets(1).Cells(I, 8).CopyFromRecordset rs
End If
Next I
With ThisWorkbook.Sheets(2)
.Range("A1").CopyFromRecordset rs
End With
【讨论】:
谢谢@Parfait 和 wackojacko1997。冻糕你对百分比运算符确实是正确的。我的所有数据都使用“”作为通配符。当我将“”更改为“%”时,我的查询有效。我更简单的查询有效(根据 wacko 的建议),所以 Parfait 你的建议是有道理的。感谢大家的帮助! 很高兴听到并乐于提供帮助!不要只更改通配符,请注意parameterization!如果此解决方案有效,请参阅thanks!以上是关于SQL 查询在 Excel 中不起作用,但在 Access 中起作用的主要内容,如果未能解决你的问题,请参考以下文章
媒体查询在 chrome 中不起作用,但在 iphone 上起作用
为啥按 count(lab_results.testid) desc 排序在 C# 中不起作用 - 但在 SQL Server 中很好?