【问题标题】:MS Access query from VB6 too long?VB6 的 MS Access 查询太长?
【发布时间】:2013-05-16 07:04:35
【问题描述】:

我从 VB6 应用程序对 Access 2010 DB 执行查询。 SQL 看起来像这样:

SELECT *, NetPrice AS Price 
FROM Products 
WHERE Len(ProductName)<>0 AND ProductID IN (1,5,8,13);

以下代码执行查询:

Set ResultRecordset = myDataBase.OpenRecordset(SqlCode, dbOpenSnapshot)

到目前为止,一切都很好,但是当 List 中的 ID 数量增加到大约 50 时,ResultRecordset 是Nothing。我发现 Access here 有一些限制,但我远远低于那里提供的值(1 个表,200 个字符的查询长度,没有嵌套的子查询,...)。任何想法出了什么问题?

【问题讨论】:

  • 如果我理解正确,如果从 VB 运行,则不会执行查询(是否有任何错误或只是返回错误的数据?)。您是否尝试在 Access 主窗口中将其作为普通查询运行?
  • 只是暗中尝试,但我认为您的 ProductID IN (1,5,8,13 /* ... and some 50 more ... */) 可能会在实际执行的查询中达到 50 个子查询的限制。
  • @Vocitus:好点子。我试过了,它在 Access 中工作!在 VB6 中,我没有收到任何错误消息,但 Recordset 什么都没有。
  • @Filburt:有可能,不过按照前面的说法,这更有可能是VB6-Access交互的问题。
  • 这是一个荒谬的 WHERE 子句。使用 50 多个产品 ID 创建另一个表,并在其上进行 INNER JOIN 以过滤结果。

标签: ms-access vb6


【解决方案1】:

我相信 Filburt 实际上更符合您的 IN(列表中大约 50 个)部分的查询。我知道在 FoxPro 中(并回到这个),它也支持 IN() 子句。但是,IN 功能仅设计为接受列表中最多 20 个参数。如果您想做的不止这些,您需要将其拆分为多个 IN() 语句,每个语句之间使用 OR ... 例如

where
   ProductID IN ( 1, 2, 20, 32, ...)
   OR ProductID IN (46, 50, 52, ...)

通过拆分它们可能是您正在运行的内容。

【讨论】:

  • 我知道你正在使用 VB,但相信它与 C# 中的相同。 VB6 不是 VB .NET,dbOpenSnapshot 建议 DAO 不是 ADO,而且肯定不是 ADO .NET。
  • @ta.speot.is,虽然它可能是 DAO,但如果底层处理是 IN() 操作的限制,则可以通过拆分来轻松测试以确认。
  • 是的,但在 VB6 中没有 using 语句或 IDisposable 等效项。
  • @ta.speot.is,删除了 USING 和 try/catch 的上下文……但拆分 IN() 的潜在问题更为重要。
  • 我试过了 - 不幸的是没有运气。无论如何,感谢您的想法,它似乎指向了正确的方向。你知道在VB6中是否可以合并多个Recordsets吗?
【解决方案2】:

您可以在查询中尝试 UNION ALL 运算符,以便发送到 Access 的查询如下所示:

SELECT *, NetPrice AS Price 
FROM Products 
WHERE Len(ProductName)<>0 AND ProductID IN (1,2,3,4,5,6,7,8,9)

Union All

SELECT *, NetPrice AS Price 
FROM Products 
WHERE Len(ProductName)<>0 AND ProductID IN (10,11,12,13,14,15,16)

假设您的 ProductID 列已编入索引,这也应该让您的查询运行得更快。

【讨论】:

    【解决方案3】:

    我找到了解决办法:

    SqlCode="SELECT *, NetPrice AS Price FROM Products WHERE Len(ProductName)<>0"
    Set TempRecordset = myDataBase.OpenRecordset(SqlCode, dbOpenSnapshot)
    TempRecordset.Filter="ProductID IN (1,2,..,50)"
    Set ResultRecordset=TempRecordset.OpenRecordset
    

    【讨论】:

      猜你喜欢
      • 2014-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多