我正在开发一个使用IBM.Data.DB2.iSeries.dll连接到DB2 iSeries 7.1数据库的.NET应用程序。
我需要执行一个带有n个参数的SELECT命令,这些参数在查询中定义为@paramX,之后再设置参数值,但是当我运行代码时,我得到一个SQL048 Use of parameter marker notvalid.。我到处都在搜索文档/示例,但是我阅读的所有内容都与我使用的代码一致。我想念什么吗?如果这无效,最好的替代方法是什么?
@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
这实际上是可行的,但是没有更好的方法来解决这个问题吗?
AFAIK,这是一个平台限制。可以通过平台添加到应用程序异常的解释来确认。话虽这么说,因为我无法更改收到的参数,也无法访问将要保存在查询中的信息,因此针对我的特定问题的最佳解决方案是对 TIMESTAMP 的类型进行 CAST 标量函数用途,例如: ***
SELECT TIMESTAMP(cast(@param0 as DATE),cast(@param1 as TIME)) FROMSYSIBM.SYSDUMMY1