为什么此SQL查询在查询设计器中工作,而在VBA for Access中不工作?

为什么此SQL查询在查询设计器中工作,而在VBA for Access中不工作?,sql,vba,ms-access,Sql,Vba,Ms Access,当我在Create>Query中一个接一个地执行以下两个查询时,它们工作得非常好。当我尝试在VBA中执行查询时,只有第一个(invoiceline)起作用 事实上,我知道问题不在于查询本身,而在于我建立联系的方式。我在尝试执行查询时遇到错误 按下按钮时,此查询将正确执行 按钮无单击() 此操作失败并出现错误 按钮两次单击() 第二个查询依赖于第一个查询来完成,这两个查询在Microsoft Access的查询设计器中同样可以完美地工作,但第二个查询在VBA SQL宏或过程中运行时失败 这就是我看

当我在Create>Query中一个接一个地执行以下两个查询时,它们工作得非常好。当我尝试在VBA中执行查询时,只有第一个(invoiceline)起作用

事实上,我知道问题不在于查询本身,而在于我建立联系的方式。我在尝试执行查询时遇到错误

按下按钮时,此查询将正确执行

按钮无单击()

此操作失败并出现错误

按钮两次单击()

第二个查询依赖于第一个查询来完成,这两个查询在Microsoft Access的查询设计器中同样可以完美地工作,但第二个查询在VBA SQL宏或过程中运行时失败

这就是我看到的错误:

运行时错误“-2147217900(80040e14)”:

[QODBC][sql语法错误]未找到预期的词法元素:=)

更新

我已经尝试了所有这些,但没有运气,还有其他建议吗

01-10-2005

2005-01-10

01/10/2005

2005/01/10

在这里阅读

正确的格式似乎是{d'YYYY-MM-DD'} 提供了一个函数,使日期成为正确的字符串

功能:

Function fncqbDate(myDate As Date) As String
myDate = Nz(myDate, Now)
fncqbDate = "{d '" & Year(myDate) & "-" & Right("00" & Month(myDate), 2) & "-" & Right("00" & Day(myDate), 2) & "'}"
End Function
在这里读一读

正确的格式似乎是{d'YYYY-MM-DD'} 提供了一个函数,使日期成为正确的字符串

功能:

Function fncqbDate(myDate As Date) As String
myDate = Nz(myDate, Now)
fncqbDate = "{d '" & Year(myDate) & "-" & Right("00" & Month(myDate), 2) & "-" & Right("00" & Day(myDate), 2) & "'}"
End Function

正如@Minty评论和发布的,你的日期就是问题所在

  • 在MS Access GUI内运行查询(如使用查询设计器)时,您将使用Access SQL方言进行管理
  • 当通过ODBC驱动程序连接到外部数据库时,您将使用连接数据库的SQL方言进行管理,这里是Quickbooks
没有两种SQL方言是相同的,但大多数都试图符合ANSI标准。因此,查询设计器和VBA之间的相同查询可能会失败

MS访问 MS访问日期如果按字面形式发送,则应使用哈希标记封装,

插入发票(CustomerRefListID、ARAccountRefListID、TxnDate、RefNumber、,
BillAddressAddr1,BillAddressAddr2,BillAddressCity,BillAddressState,
BillAddressPostalCode、BillAddressCountry、iSpend、TermsRelistid、,
DueDate、ShipDate、ItemSalesTaxRefListID、[Memo],IsToBePrinted、,
CustomerSalesTaxCodeRefListID)
价值('800001F6-1482536280','800001E-1478562986','9/23/2020','1','Brad Lamb',',
‘1921苹果巷’、‘海岸’、‘加利福尼亚’、‘94326’、‘美国’、‘0’、‘80000002-1478562832’,
#2020年10月31日,2020年10月1日,8000295C-1541711590,
“备忘录测试”,0,“8000001-1478562826”)
或者,使用
CDate()
将字符串转换为日期:

插入发票(CustomerRefListID、ARAccountRefListID、TxnDate、RefNumber、,
BillAddressAddr1,BillAddressAddr2,BillAddressCity,BillAddressState,
BillAddressPostalCode、BillAddressCountry、iSpend、TermsRelistid、,
DueDate、ShipDate、ItemSalesTaxRefListID、[Memo],IsToBePrinted、,
CustomerSalesTaxCodeRefListID)
价值('800001F6-1482536280','800001E-1478562986',CDate('9/23/2020'),'1','Brad Lamb',
‘1921苹果巷’、‘海岸’、‘加利福尼亚’、‘94326’、‘美国’、‘0’、‘80000002-1478562832’,
CDate('10/31/2020')、CDate('10/01/2020')、'8000295C-1541711590',
“备忘录测试”,0,“8000001-1478562826”)

Quickbooks ODBC 在Quickbooks中,必须遵守其日期要求
{d'YYYY-MM-DD'}
或函数形式
fncqbDate()
。但是,关于这些方法的文档很少,甚至不存在,并且可能因ODBC驱动程序版本而异

sql=“插入发票(CustomerRefListID、ARAccountRefListID、TxnDate、RefNumber,”_
&BillAddressAddr1,BillAddressAddr2,BillAddressCity_
&BillAddressState、BillAddressPostalCode、BillAddressCountry、_
&IsPending、TermsReflisted、DueDate、ShipDate、_
&ItemSalesTaxRefListID[Memo],IsToBePrinted_
&“CustomerSalesTaxCodeRefListID)”_
&“值('800001F6-1482536280','800001E-1478562986',{d'2020-09-23','1',”_
&“'Brad Lamb','1921 Applesed Lane','Bayshore','CA','94326','USA',0,”
&“'80000002-1478562832',{d'2020-10-31'},{d'2020-10-01'},”_
&‘8000295C-1541711590’、‘备忘录测试’、‘0’、‘80000001-1478562826’’

参数化 尽管如此,即使上述方法不起作用,这也是参数化的另一个很好的理由,参数化是任何应用程序层(如VBA)运行SQL的编程行业标准。参数化有助于客户机和服务器之间的数据类型映射,而无需引用或其他符号闭包。ADO不支持对象(而不是ADO记录集)中带有方法的参数

”准备好的带有占位符的语句(无文字数据)
sql=“插入发票(CustomerRefListID、ARAccountRefListID、TxnDate、RefNumber,”_
&BillAddressAddr1,BillAddressAddr2,BillAddressCity_
&BillAddressState、BillAddressPostalCode、BillAddressCountry、_
&IsPending、TermsReflisted、DueDate、ShipDate、_
&ItemSalesTaxRefListID[Memo],IsToBePrinted_
&“CustomerSalesTaxCodeRefListID)”_
&“值(?,,,,,,,,,,,,,,,,,,,”
& "         ?, ?, ?, ?, ?, ?, ?, ?, ?)"
“开放连接
Set-oConnection=CreateObject(“ADODB.Connection”)
o连接。打开sConnectString
'初始化并运行命令
设置oCmd=create
Function fncqbDate(myDate As Date) As String
myDate = Nz(myDate, Now)
fncqbDate = "{d '" & Year(myDate) & "-" & Right("00" & Month(myDate), 2) & "-" & Right("00" & Day(myDate), 2) & "'}"
End Function