我试图运行参数化查询对DB2数据库。网用户访问ODBC Driver使用下列代码:

var db2Cmd = new OdbcCommand("INSERT INTO presnlats (LAT) VALUES (@LAT)", db2Conn);
db2Cmd.Parameters.AddWithValue("@LAT", insertValue);
Console.Out.WriteLine(db2Cmd.ExecuteNonQuery());

当执行, OdbcException 是扔:

错误[42S22][IBM][荣获i系列访问ODBC Driver][DB2施]SQL0206列@LAT不在指定的表格。

互联网 似乎意味着参数化的查询是支持通过客户访问ODBC driver,但这个错误似乎表明,否则。有什么是错误的,与供给代码?

有帮助吗?

解决方案

您是否尝试过使用?作为占位符代替@LAT?

var db2Cmd = new OdbcCommand("INSERT INTO presnlats (LAT) VALUES (?)", db2Conn);

db2Cmd.Parameters.AddWithValue("LAT", insertValue);

Console.Out.WriteLine(db2Cmd.ExecuteNonQuery());

这是使用OdbcConnection /的OdbcCommand时什么MS Access需要。

您只需要确保你的Parameters.AddWithValue()语句是在同一顺序的INSERT语句中的字段列表。传递给AddWithValue()第一个参数似乎并不重要,但按照惯例,我让一样的字段名。

其他提示

如果我的猜测正确的在你想要什么你想做这样的:

你想添加一个参数,并且需要改变价值的参数。

var db2Cmd = new OdbcCommand("INSERT INTO presnlats (LAT) VALUES (@Lat)", db2Conn);
db2Cmd.Parameters.AddWithValue("@Lat", 0);


for (int j = 0; j < reader.FieldCount; ++j)
{
   db2Cmd.Parameters["@Lat"].Value = reader[j];
   Console.Out.WriteLine(db2Cmd.ExecuteNonQuery());
}

加入

你只有一个 占位 (@纬度)为你的参数 在命令,所以你应该只增加一个参数。你的代码增加一个新的参数对每个对象 读者。不是这些参数之一将被命名为"@纬度"除非你的读者是返回的一个值@Lat。

我仍然相当积极的,你需要一个参数(@纬度),并需要修改的参数值的循环。

澄清的语法使用parameteized的查询,考虑该声明:

cmd。CommandText="Insert Into人(FirstName"LastName")Values(@fName,@lName)

在上述声明,@fName和@lName不参数。他们占位的参数。

你需要明确添加参数使用下列规则:

  • 的参数必须被命名完全相同的作为占位
  • 该parmaters必须加以正确的顺序。

所以一个更全面的例子就是

cmd。CommandText="Insert Into人(FirstName"LastName")Values(@fName,@lName)

cmd。参数。AddWithValue("@fName","大卫");//This线,在这方面,说"Repalce的参数palceholder从以前行用这个实际的参数。cmd。参数。AddWithValue("@lName","斯特拉顿");//同样,这将替换@lname占位符。

然后如果我有一个数据读取器有一大堆的名字,我可以repleatedly分配的价值从阅读器,价值的参数。

同时(myReader.Read()) { cmd。参["@fName'].值=myReader.形式("FirstNameField");cmd。参["@lName'].值=myReader.形式("LastNameField");cmd。ExecuteNonQuery();

}

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top