c# - 带参数的 iDB2 Select 命令返回 SQL0418

标签 c# sql .net db2

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

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

这是我用来测试的独立代码。

    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

这确实有效,但是没有更好的方法来处理这个问题吗?

最佳答案

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

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

关于c# - 带参数的 iDB2 Select 命令返回 SQL0418,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23958467/

相关文章:

c# - 减少 regex/linq 的 2 GB 内存占用或解决获取不同组值的问题

c# - 正则表达式 C# - 是否可以在匹配时提取匹配项?

c# - 将十六进制字符串转换为日期时间的困难

c# - 如何从 RichTextBox 获取 RTF

.net - 如何使用 .Net 创建 Outlook PST 文件?

c# - 将具有不同关系值的表转换为 Excel 列

c# - 以 string.contains() 作为参数的 switch() 语句

c# - LinQ 到实体 : Query with five tables JOIN

sql - 我们可以在 PostgreSql 中向类型表添加列吗?

sql - Postgres : STABLE function called multiple times on constant