iDB2选择带有返回SQL0418的参数的命令

时间:2014-05-30 15:45:55

标签: c# sql .net db2

我正在使用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不知道参数的基础类型(这很奇怪,因为我强力键入它),因此,可能的解决方案是在查询中对预期的参数类型执行强制转换,如下所示:

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

这实际上有效,但是,有没有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:2)

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

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