我有一个旧的vb6程序,用于查询访问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对象的限制,还是有其他解释?有什么方法可以解决这个问题吗?
很遗憾,我无法升级到较新版本的访问权限。
答案 0 :(得分:2)
您发布的SQL语句的截断版本长度为246个字符,因此沿着该行的某些内容将SQL字符串的长度限制为大约255个字符。正如您通过将查询粘贴到Access本身中发现的那样,Access查询字符串的实际大小限制要大得多(我相信大约64,000个字符)。
我记得多年前遇到类似的问题,但我的问题是一个INSERT语句,它正在向数据库写一些相当长的字符串。在这种情况下的解决方法是使用参数查询(事后我意识到,我应该一直在使用它)。它大大缩短了SQL字符串的长度,因为参数是单独传递的。不幸的是,这种解决方法可能对您没有帮助,因为即使您动态创建了查询的参数化版本,它也不会比当前的SQL字符串短得多。
另一种解决方法是将IN子句中的所有数字写为名为[inValues]的临时表中的行,然后使用查询
SELECT [table].*
FROM
[table]
INNER JOIN
[inValues]
ON [table].[key] = [inValues].[key]