来自.NET的参数化DB2查询

我试图使用客户端访问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不在指定的表中。

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

你试过用过吗? 作为占位符而不是@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()的第一个参数似乎并不重要,尽管按惯例我将它与字段名称相同。

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

您想要添加一个参数,并且需要更改循环中参数的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 =“插入Person(FirstName,LastName)值(@fName,@ list)

在上面的语句中,@ fName和@lName不是参数。 它们是参数的占位符。

然后,您需要使用以下规则明确添加参数:

  • 参数的名称必须与占位符完全相同
  • 必须以正确的顺序添加parmaters。

所以一个更完整的例子就是

cmd.CommandText =“插入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();

}