6

我正在尝试使用客户端访问 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抛出 an:

错误 [42S22] [IBM][iSeries Access ODBC 驱动程序][DB2 UDB]SQL0206 - 列 @LAT 不在指定的表中。

互联网似乎暗示客户端访问 ODBC 驱动程序支持参数化查询,但此错误似乎另有说明。提供的代码有什么问题吗?

4

2 回答 2

10

你试过使用吗?作为占位符而不是@LAT?

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

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

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

这是 MS Access 在使用 OdbcConnection / OdbcCommand 时所需要的。

您只需要确保您的 Parameters.AddWithValue() 语句与 INSERT 语句中的字段列表的顺序相同。传递给 AddWithValue() 的第一个参数似乎无关紧要,尽管按照惯例,我将其与字段名称相同。

于 2010-03-03T20:35:18.150 回答
0

如果我猜对了你想要做的事情,你想这样做:

您要添加 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();

}

于 2010-03-03T20:41:10.650 回答