使用ODBC连接查询参数到.NET中的iSeries AS400数据库?

时间:2014-03-05 22:33:48

标签: c# odbc ibm-midrange

如果我正确理解this link,我应该能够将查询参数值传递给我的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.

感谢所有想要帮助的人!是的,如果我执行无参数查询,它可以正常工作。

2 个答案:

答案 0 :(得分:4)

显然你不能像Paramertize Fetch First n Rows Only in DB2中讨论的那样参数化FETCH FIRST ROWS,你可以将它直接放在sql字符串中或使用不同的策略。

不知道如何更改评论以回答

答案 1 :(得分:0)

AFAIK,允许参数标记,可以确定结果数据类型,例如,列定义可用的位置。请参阅PREPARE statement下的表1.,了解允许的标记位置列表以及如何在这些位置指定标记。

由于没有"列"值必须与之兼容,没有进行任何开发来为DB2提供任何意义(首先获取#39;标记)。此外,由于OLAP specifications可用于提供ROW_NUMBER(),因此可能没有太多要求将开发工作放入可能不太有用的查询元素中。 (如前所述,FETCH FIRST子句通常用于性能而不是严格的结果,但实际上它确实限制了结果集中可用的行数。)

如果由于某种原因,FETCH FIRST 必需,则您需要使用动态声明。