小编典典

iDB2 Select命令的参数返回SQL0418

sql

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

我需要执行一个带有n个参数的SELECT命令,这些参数在查询中定义为@paramX,之后再设置参数值,但是当我运行代码时,我得到一个SQL048 Use of parameter marker notvalid.。我到处都在搜索文档/示例,但是我阅读的所有内容都与我使用的代码一致。我想念什么吗?如果这无效,最好的替代方法是什么?

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

    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

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


阅读 274

收藏
2021-04-28

共1个答案

小编典典

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

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

2021-04-28