我正在尝试使用客户端访问ODBC驱动程序使用以下代码从.NET运行针对DB2数据库的参数化查询:
var db2Cmd = new OdbcCommand("INSERT INTO presnlats (LAT) VALUES (@LAT)", db2Conn);
db2Cmd.Parameters.AddWithValue("@LAT", insertValue);
Console.Out.WriteLine(db2Cmd.ExecuteNonQuery());
执行时,会抛出OdbcException
:
错误[42S22] [IBM] [iSeries Access ODBC驱动程序] [DB2 UDB] SQL0206 - 列@LAT不在指定的表中。
The internets似乎暗示客户端访问ODBC驱动程序支持参数化查询,但此错误似乎表明不是这样。提供的代码有什么问题吗?
答案 0 :(得分:10)
你试过用过吗?作为占位符而不是@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()的第一个参数似乎并不重要,尽管按惯例我将它与字段名称相同。
答案 1 :(得分:0)
如果我正在猜测你想做什么,你想要这样做:
您想要添加一个参数,并且需要更改循环中参数的VALUE。
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) 在命令中,所以你应该只添加一个参数。 您的代码正在为每个对象添加一个新参数 读者。除非您的读者返回@Lat值,否则这些参数中没有一个会被命名为“@Lat”。
我仍然非常肯定您需要一个参数(@Lat)并且需要修改循环中参数的值。
澄清使用参数化查询的语法,请考虑以下声明:
cmd.CommandText =“Insert into Person(FirstName,LastName)值(@ fName,@ list)
在上面的语句中,@ fName和@lName不是参数。它们是参数的占位符。
然后,您需要使用以下规则明确添加参数:
所以更完整的例子是
cmd.CommandText =“Insert into Person(FirstName,LastName)值(@ fName,@ list)
cmd.Parameters.AddWithValue(“@ fName”,“David”); //在此上下文中,此行显示“使用此实际参数从上一行重新生成参数palceholder。 cmd.Parameters.AddWithValue(“@ lName”,“Stratton”); //同样,这将取代@lname占位符。
然后,如果我有一个具有一堆名称的datareader,我可以重新将阅读器的VALUE分配给参数的VALUE。
while(myReader.Read()) { cmd.Parameters [“@ fName']。Value = myReader.GetString(”FirstNameField“); cmd.Parameters [“@ lName']。Value = myReader.GetString(”LastNameField“); cmd.ExecuteNonQuery();
}