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



我有一个旧的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]

相关内容

  • 没有找到相关文章

最新更新