我正在使用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
这实际上有效,但是,有没有更好的方法来解决这个问题?
答案 0 :(得分:2)
AFAIK,这是一个平台限制。这可以通过平台添加到应用程序异常*的解释来确认。话虽这么说,因为我无法更改我收到的参数,也无法访问查询中将要保存的信息,我的具体问题的最佳解决方案是执行 CAST 对于 TIMESTAMP 标量函数使用的类型,例如:
SELECT TIMESTAMP(cast(@param0 as DATE),cast(@param1 as TIME)) FROM SYSIBM.SYSDUMMY1