数据对象是否具有最大查询长度?

时间:2013-12-04 15:26:50

标签: ms-access vb6 ms-access-2000

我有一个旧的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对象的限制,还是有其他解释?有什么方法可以解决这个问题吗?

很遗憾,我无法升级到较新版本的访问权限。

1 个答案:

答案 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]