iDB2选择命令,其参数返回SQL0418

我正在开发一个使用IBM.Data.DB2.iSeries.dll连接到DB2 iSeries 7.1数据库的.NET应用程序。

我需要执行一个SELECT命令,该命令具有n个参数,这些参数在查询中定义为@paramX ,之后设置参数值,但是当我运行代码时,我得到一个SQL048 Use of parameter marker not valid. 。 我到处搜索文档/示例,但我读过的所有内容都与我正在使用的代码相同。 我错过了什么吗? 如果这是无效的,最好的选择是什么?

这是我用来测试的隔离代码。

  static void Main(string[] args) { String myConnectionString = "DataSource=*******;Database=*******;UserId=*******;Password=*******;"; iDB2Connection myConnection = new iDB2Connection(); try{ myConnection.ConnectionString = myConnectionString; myConnection.Open(); var cmd = new iDB2Command("SELECT TIMESTAMP(DATE(@param0),TIME(@param1)) FROM SYSIBM.SYSDUMMY1", myConnection); cmd.Parameters.Add(new iDB2Parameter("@param0", iDB2DbType.iDB2Char)); cmd.Parameters["@param0"].Value = "1900-01-01"; cmd.Parameters.Add(new iDB2Parameter("@param1", iDB2DbType.iDB2Char)); cmd.Parameters["@param1"].Value = "00.00.00"; using (var reader = cmd.ExecuteReader()) { if (reader.HasRows) { reader.Read(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < reader.FieldCount; i++) { sb.AppendLine(reader[i].ToString().Trim()); } Console.Out.WriteLine(sb.ToString()); } } }catch(Exception e) { Console.Out.WriteLine(e.ToString()); }finally{ if (myConnection != null) { myConnection.Close(); } } Console.Read(); } 

编辑

在一个不相关的答案中,我发现问题可能是DB2不知道参数的基础类型(这很奇怪,因为我powershell键入它),因此,一个可能的解决方案是在查询预期的参数类型,如下:

SELECT TIMESTAMP(DATE(cast(@param0 as char(10))),TIME(cast(@param1 as char(10)))) FROM SYSIBM.SYSDUMMY1

这实际上有效,但是,有没有更好的方法来处理这个?

AFAIK,这是一个平台限制。 这可以通过平台添加到应用程序exception*的解释来确认。 话虽这么说,因为我无法更改我收到的参数并且无法访问它们将在查询中保存的信息,我的具体问题的最佳解决方案是对TIMESTAMP的类型执行CAST标量函数使用,例如:

SELECT TIMESTAMP(cast(@param0 as DATE),cast(@param1 as TIME)) FROM SYSIBM.SYSDUMMY1