【问题标题】:Why do brackets in SQL around field name not work in Access VBA ADO?为什么 SQL 中字段名称周围的括号在 Access VBA ADO 中不起作用?
【发布时间】:2010-12-23 21:48:12
【问题描述】:

在 MS Access QBE 中,如果我粘贴以下 SQL,它可以正常工作并且我得到 2 条记录-

SELECT [tmp_binning].[bn_faibash] FROM [tmp_binning] WHERE key2='0210043-HOU-STOR' ORDER BY [tmp_binning].[bn_faibash];

但是,如果我以编程方式从 ADO 对象在 VBA 中运行相同的查询,我(错误地)没有得到任何记录。如果我更改 SQL 以删除字段名称周围的括号,它确实会正确返回 VBA ADO 中的 2 条记录。

SELECT [tmp_binning].bn_faibash FROM [tmp_binning] WHERE key2='0210043-HOU-STOR' ORDER BY [tmp_binning].bn_faibash;

我在谷歌上搜索不成功,为什么我自己会发生这种情况,谁能告诉我为什么?

谢谢。

【问题讨论】:

  • 谁在乎为什么语法不同?每种 SQL 风格都有点不同。 SQL Server T-SQL 不同于 Oracle 不同于 DB2 不同于 Teradata 不同于 My SQL。
  • 呃,它不是使用不同的 SQL 方言,只是不同的接口。它不应该是不同的。但是,这又是使用从不需要括号的命名约定的另一个论据。在我看来,这也是从不使用 ADO 的论据。
  • @DOK,我关心我理解为什么我正在使用的工具会出现奇怪的差异,以及这是我的错误还是奇怪的故障。正如大卫指出的那样,这也不是一种不同的方言。 @David,我也不喜欢需要空格的命名约定,但我支持以前编写的工具,该工具需要大量工作才能删除所有以前的不良做法。你觉得 DAO 比 ADO 更可靠吗?谢谢。
  • 为了处理来自 Access 的 Jet/ACE 数据,DAO 是正确的接口(并且一直如此)。从外部访问,这取决于您使用的工具是 ADO 还是 DAO 是最佳选择。经典 ADO 在所有平台上都已死,所以我会警惕在任何环境中使用它。
  • @David-W-Fenton 我认为这不是真的:bytes.com/topic/access/answers/458870-ado-dead-2-a

标签: sql ms-access vba


【解决方案1】:

首先,无论是在 Access UI 中还是通过 ADO,都不需要括号。只需在所有环境中省略它们,问题就会消失。 (如果添加括号的是 Access QBE,那么请考虑使用其他工具或手工制作 SQL 代码!)

其次,即使使用括号,我也无法使用您的 SQL 代码重现错误,例如

Sub gjskdjs()

  On Error Resume Next
  Kill Environ$("temp") & "\DropMe.mdb"
  On Error GoTo 0

  Dim cat
  Set cat = CreateObject("ADOX.Catalog")
  With cat
    .Create _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=" & _
        Environ$("temp") & "\DropMe.mdb"
    With .ActiveConnection

      Dim Sql As String


      Sql = _
          "CREATE TABLE tmp_binning" & vbCr & "(" & vbCr & " bn_faibash VARCHAR(255)," & _
          " " & vbCr & " key2 VARCHAR(255)" & vbCr & ");"
      .Execute Sql

      Sql = _
          "INSERT INTO tmp_binning (bn_faibash, key2)" & _
          " VALUES ('002', '0210043-HOU-STOR');"
      .Execute Sql

      Sql = _
          "INSERT INTO tmp_binning (bn_faibash, key2)" & _
          " VALUES ('001', '0210043-HOU-STOR');"
      .Execute Sql

      Sql = _
          "SELECT [tmp_binning].bn_faibash " & vbCr & "  FROM" & _
          " [tmp_binning] " & vbCr & " WHERE key2 = '0210043-HOU-STOR'" & _
          " " & vbCr & " ORDER " & vbCr & "    BY [tmp_binning].bn_faibash;"
      Dim rs
      Set rs = .Execute(Sql)
      MsgBox rs.GetString
    End With
    Set .ActiveConnection = Nothing
  End With
End Sub

考虑将您的架构发布为带有示例数据的 SQL DDL。

【讨论】:

  • 这最初是我试图抽象出来用于多个表的 VBA 函数的一部分,不幸的是,有些表或字段名称中有空格。因此,除非我花费大量时间修改许多表、字段和 VBA 函数中的所有空格,否则括号是必需的。当我从 VBA 函数中得到错误的结果时,我举了一个它将运行的 SQL 示例,发现它在 QBE 中运行良好。我发现如果在 VBA 中删除了字段名称周围的括号,它工作正常。我将尝试编写代码来重新创建数据库,但这可能需要一点时间。谢谢。
  • 您是否考虑过创建一个保存的 QueryDef,将有问题的表/字段名称别名为不需要括号的名称,然后使用它?我不确定它是否会绕过您遇到的错误,但如果我必须按照您的描述做,我会考虑。
  • @David-W-Fenton:如果您建议创建一个VIEW 来重命名有空格的列,那么这对我来说听起来不错。但是QueryDef是一个DAO对象,提出从ADO到DAO的转换是不合适的。
  • @onedaywhen:我必须在这里支持大卫芬顿。他只是在争辩说,在讨论 Access 环境时应该使用 Access 环境的术语约定。在那种环境中使用术语视图是引入一个外来术语。此外,粗略的 Google 搜索 jet querydef 得到了第一个结果 (technet.microsoft.com/en-us/library/cc966376.aspx),其中包括文本“有关创建 QueryDef 对象的信息,请参阅本章后面的“Microsoft Jet QueryDef 对象”部分。”跨度>
  • 您断言您使用的术语对 Access 用户有帮助是错误的。也许有些人(甚至很多人)会熟悉非 Access 术语,并且能够理解您的意思。但是,如果您要回答 Access 问题,我认为首先采用 Access 上下文并使用 Access 术语是有意义的(即使您还提供外来术语作为说明;反之亦然)。你错了,坚持使用外国术语是有帮助的——它只会让事情变得不那么清楚。
猜你喜欢
  • 2011-04-02
  • 2021-04-16
  • 2020-01-30
  • 2016-04-22
  • 2010-09-20
  • 2019-03-29
  • 2013-09-13
  • 2017-12-05
  • 1970-01-01
相关资源
最近更新 更多