0

我有一个查询 access 2000 数据库的旧 vb6 程序。我有一个相当长的查询,看起来像这样:

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

不幸的是,我无法升级到更新版本的访问权限。

4

1 回答 1

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]
于 2013-12-04T16:38:01.773 回答