将查询参数与 .NET 中的 iSeries AS400 数据库的 ODBC 连接配合使用



如果我正确理解了此链接,我应该能够将查询参数值传递给我的 ODBC 命令并使其成功执行。它没有,所以这是我的问题代码:

OdbcConnection myConnection = new OdbcConnection("DSN=myODBCConnection");
myConnection.Open();
OdbcCommand myCommand = myConnection.CreateCommand();
myCommand.CommandText = "SELECT * FROM MyTable FETCH FIRST ? ROWS ONLY";
myCommand.CommandType = CommandType.Text;
myCommand.Parameters.AddWithValue("P1", 5);
OdbcDataReader myDataReader;
// Fails here! It doesn't recognize P1 as a parameter to pass in for ?.
myDataReader = myCommand.ExecuteReader();

代码应从 MyTable 中选择前 5 行。相反,它会引发此错误:

System.Data.Odbc.OdbcException: ERROR [42000] [IBM][System i Access ODBC Driver][DB2 for i5/OS]SQL0104 - Token ? was not valid. Valid tokens: ROW ROWS.

感谢任何愿意提供帮助的人!是的,如果我执行无参数查询,它可以正常工作。

显然,您无法参数化 FETCH FIRST 行,如 Paramertize 获取前 n 行中所述 仅在 DB2 中,您可以将其直接放在 SQL 字符串中,也可以使用不同的策略。

不知道如何将评论更改为答案

> AFAIK,在可以确定结果数据类型的地方允许使用参数标记,例如,在列定义可用的情况下。请参阅表 1。在 PREPARE 语句下,以获取允许的标记位置列表以及如何在这些位置指定标记。

由于没有值

必须兼容的"列",因此没有进行任何开发来赋予 DB2("获取优先"标记)任何含义。此外,由于 OLAP 规范可用于提供 ROW_NUMBER(),因此可能不需要将开发工作投入到可能不太有用的查询元素中。(如前所述,FETCH FIRST 子句通常更多地是为了提高性能而不是严格的结果,尽管它实际上确实限制了结果集中可用的行数。

如果出于某种原因需要 FETCH FIRST,则需要使用动态语句。

最新更新