来自VB6的MS Access查询时间太长了?

时间:2013-05-16 07:04:36

标签: ms-access vb6

我从VB6应用程序对Access 2010数据库执行查询。 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个字符的查询长度,没有嵌套的子查询,......)。有什么想法会出错吗?

3 个答案:

答案 0 :(得分:1)

我相信Filburt实际上更符合你的IN(在列表中大约50个)部分查询的目标。我知道在FoxPro中(并回到这个),它也支持IN()子句。但是,IN功能仅用于接受列表中最多20个参数。如果你想做更多的事情,你需要将它分成多个IN()语句,每个语句之间有OR ...例如

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

通过拆分他们可能就是你所经营的。

答案 1 :(得分:0)

您可以在查询中尝试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列已编入索引。

答案 2 :(得分:0)

我找到了一个解决方案:

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