如果我猜对了你想要做的事情,你想这样做:
您要添加 ONE 参数,并且需要在循环中更改参数的 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 = "插入人(名字,姓氏)值(@fName,@lName)
在上面的语句中,@fName 和@lName 不是参数。它们是参数的占位符。
然后,您需要使用以下规则显式添加参数:
- 参数的命名必须与占位符完全相同
- 必须以正确的顺序添加参数。
所以一个更完整的例子是
cmd.CommandText = "插入人(名字,姓氏)值(@fName,@lName)
cmd.Parameters.AddWithValue("@fName", "David"); // 在这种情况下,这一行表示“用这个实际参数替换上一行中的参数 palceholder。cmd.Parameters.AddWithValue("@lName", "Stratton"); // 同样,这替换了 @lname 占位符.
然后,如果我有一个具有一堆名称的数据读取器,我可以将读取器的值重新分配给参数的值。
while (myReader.Read()) { cmd.Parameters["@fName'].Value = myReader.GetString("FirstNameField"); cmd.Parameters["@lName'].Value = myReader.GetString("LastNameField") ; cmd.ExecuteNonQuery();
}