我有一个旧的vb6程序,它查询access 2000数据库。我有一个相当长的查询,看起来像这样:
Select * from table where key in ( 0, 1, 2, 3, 4, 5, 6, 7, 11, 12, 13, 14, 15, 19, 20, 21, 24, 27, 29, 30, 35, 38, 39, 40, 42, 43, 44, 46, 47, 49, 50, 53, 56, 59, 60, 61, 63, 64, 65, 66, 67, 68, 72, 76, 80, 84, 86, 89, 90, 91, 93, 94, 98, 99, 10041, 10042, 10045, 10046, 10047, 10049, 10057, 10060, 10089, 32200, 32202, 32203, 32204, 32205, 32207, 32214, 32245, 32303, 32314, 32403, 32405, 32414, 32415, 32503, 32703, 32803, 32903, 33003, 33014, 33102, 33103, 33303, 33403, 33405, 33601, 33603, 33604, 33614, 33705, 33714, 33901, 33903, 33914, 34001, 34105, 34114, 34203, 34303, 34401, 34501, 34601, 34603, 34604, 34605, 34803, 41001, 41005, 41007, 41013, 42001, 42005, 42007, 42013, 43001, 43002, 44001, 44007, 46001, 46007, 99999, 9999999)
然而,当我查看数据对象的RecordSource
时,查询似乎被截断为以下内容(这显然在语法上无效,并引发错误):
Select * from table where key in ( 0, 1, 2, 3, 4, 5, 6, 7, 11, 12, 13, 14, 15, 19, 20, 21, 24, 27, 29, 30, 35, 38, 39, 40, 42, 43, 44, 46, 47, 49, 50, 53, 56, 59, 60, 61, 63, 64, 65, 66, 67, 68, 72, 76, 80, 84, 86, 89, 90, 91, 93, 94, 98, 99, 100
我的数据源如下:
Begin VB.Data dtaList
Caption = "dtaList"
Connect = "Access 2000;"
DatabaseName = ""
DefaultCursorType= 0 'DefaultCursor
DefaultType = 2 'UseODBC
Exclusive = 0 'False
Height = 345
Left = 960
Options = 0
ReadOnly = 0 'False
RecordsetType = 1 'Dynaset
RecordSource = ""
Top = 4440
Visible = 0 'False
Width = 2295
End
我已经尝试在访问数据库本身中运行完整的查询,这很好。
这是VB.Data对象中的一个限制,还是有其他解释?有什么办法可以绕过这个问题吗?
很遗憾,我无法升级到较新版本的访问。
您发布的SQL语句的截断版本有246个字符长,因此似乎有一些内容将SQL字符串的长度限制在255个字符左右。正如您通过将查询粘贴到Access本身中发现的那样,Access查询字符串的实际大小限制要大得多(我相信大约64000个字符)。
我记得几年前遇到过一个类似的问题,但我的问题是INSERT语句向数据库中写入了一些相当长的字符串。这种情况下的解决方法是使用参数查询(事后我意识到,无论如何我都应该使用它)。它大大缩短了SQL字符串的长度,因为参数是单独传递的。不幸的是,这种变通方法可能对您没有帮助,因为即使您动态创建了查询的参数化版本,它也不会比当前的SQL字符串短那么多。
另一种解决方法是将IN子句的所有数字都写为一个名为[inValues]的临时表中的行,然后使用查询
SELECT [table].*
FROM
[table]
INNER JOIN
[inValues]
ON [table].[key] = [inValues].[key]