C# iDB2 Select命令,参数返回SQL0418

C# iDB2 Select命令,参数返回SQL0418,c#,sql,.net,db2,C#,Sql,.net,Db2,我正在开发一个.NET应用程序,它使用IBM.Data.DB2.iSeries.dll连接到DB2iSeries 7.1数据库 我需要执行一个SELECT命令,该命令包含n个参数,这些参数在查询中定义为@paramX,之后设置参数值,但是当我运行代码时,我得到一个SQL048参数标记使用无效。。我到处寻找文档/例子,但是我读到的一切都和我正在使用的代码一致。我错过什么了吗?如果这是无效的,那么最好的选择是什么 这是我用来测试的独立代码 static void Main(string[]

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

我需要执行一个SELECT命令,该命令包含n个参数,这些参数在查询中定义为
@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();
    }
static void Main(字符串[]args)
{
String myConnectionString=“DataSource=*******;Database=*******;UserId=*******;Password=*******;”;
IDB2连接myConnection=新的IDB2连接();
试一试{
myConnection.ConnectionString=myConnectionString;
myConnection.Open();
var cmd=new iDB2Command(“从SYSIBM.SYSDUMMY1中选择时间戳(日期(@param0)、时间(@param1)),myConnection);
cmd.Parameters.Add(新的IDB2参数(“@param0”,iDB2DbType.iDB2Char));
cmd.Parameters[“@param0”].Value=“1900-01-01”;
cmd.Parameters.Add(新的IDB2参数(“@param1”,iDB2DbType.iDB2Char));
cmd.Parameters[“@param1”].Value=“00.00.00”;
使用(var reader=cmd.ExecuteReader())
{
if(reader.HasRows)
{
reader.Read();
StringBuilder sb=新的StringBuilder();
对于(int i=0;i
编辑 在一个不相关的回答中,我发现问题可能是DB2不知道参数的基本类型(这很奇怪,因为我强类型输入它),因此,一个可能的解决方案是在查询中对预期的参数类型进行强制转换,如下所示:

从SYSIBM.SYSDUMMY1中选择时间戳(日期(@param0作为字符(10))和时间(@param1作为字符(10))


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

好吧,这是一个平台限制。这可以通过平台添加到应用程序异常*的解释来确认。这就是说,由于我无法更改收到的参数,也无法访问它们将在查询中保存的信息,因此我的特定问题的最佳解决方案是对TIMESTAMP标量函数使用的类型执行强制转换,例如:


从SYSIBM.SYSDUMMY1中选择时间戳(cast(@param0作为日期)、cast(@param1作为时间))

为什么不将其转换为正确的数据类型<代码>选择强制转换(@param1作为日期),强制转换(@param2作为时间).
?是否没有可以使用的
iDB2DbType.iDB2Timestamp
类型?那么你根本就不需要投…@bhamby我提到的答案只是引用了char,但我后来投了。话虽如此,它仍然需要演员阵容。@Clockwork Muse我肯定有,但是,参数不是时间戳,它们是日期和时间,分别是字符串格式,这有什么原因吗?(现在无法测试)@vvolkgang-除了你要做的第一件事就是用它创建一个时间戳,那么为什么不跳过一步,首先给它一个时间戳呢?目前,参数也不是日期/时间-它们是字符串,您告诉db以后再转换。省去一些麻烦,实际地将正确的对象类型(即,C#
datetime
)传递给正确类型的参数)。