1

我正在测试 Progress OpenEdge 应用程序中的一项功能,该应用程序将数据加载到数据库表中。我正在测试的表中的许多字段都被我们的应用程序限制为 256 个字符,所以我正在做一些边缘情况测试,尝试加载小于、等于和大于 256 个字符的条目。数据加载后,我查询数据库并验证结果。我正在通过测试程序 TestComplete 为 ODBC 驱动程序使用 OLE DB 提供程序。这是我正在使用的查询:

SELECT SUBSTRING(lname, 1, 30)
FROM pub.referral
WHERE lname LIKE 'valid%'

在我运行测试之前,ODBC 驱动程序对此查询没有任何问题。但是,在我运行它之后,该表中的某些字段有 256 个字符,并且 ODBC 驱动程序对该长度的数据存在问题。我想通过使用来避免这种情况SUBSTRING,但是当我尝试使用这个查询时,我仍然得到一个验证错误:

The specified query is invalid. Database engine reports: [DataDirect][ODBC Progress OpenEdge Wire Protocol driver]Error in row

内容丰富!当表中的数据比 ODBC 喜欢的长时,这就是我通常看到的错误。但奇怪的是,如果我去掉该WHERE子句,查询会验证并返回 30 个字符块中的数据,就像我在SUBSTRING.

发生这种情况是因为我的字段中的字符比 ODBC 驱动程序预期的要多,还是因为与子句有关的其他事情WHERE(语法不正确等?)我该如何解决这个问题?我想在不通过 dbtool 更改设置的情况下执行此操作 - 拥有数据库中的特定设置对我来说很重要,这样我的测试才能准确。

4

1 回答 1

1

我怀疑引擎正在读取不匹配的记录以查看它们是否匹配 WHERE 条件。如果不匹配记录的字段长于其 SQL-WIDTH / MAX-WIDTH 设置,则可能会给出您所看到的结果。

在不使用 WHERE 子句的情况下进行搜索意味着每条记录都是结果集的一部分,并且在输出之前将由 SUBSTRING() 命令处理。

对此进行测试的一种方法是使用相等匹配执行 WHERE - 引擎应仅读取与 WHERE 规范匹配的记录,执行 SUBSTRING(),并按预期工作。

就“绕过”这一点而言 - 要么缩短数据,要么为这些字段设置更大的 SQL-WIDTH 或 MAX-WIDTH。

这是关于该主题的知识库:http: //knowledgebase.progress.com/articles/Article/P162121

这是关于处理“太大”列的 KB:http: //knowledgebase.progress.com/articles/Article/P126779 ?q=SQL%3A+Data+truncated+and+Invalid+long+datatype+and+error&l= en_US&type=Article__kav&fs=搜索&pn=1

于 2014-07-03T03:24:42.480 回答