参数化DB2 Query From .NET

时间:2010-03-03 20:30:22

标签: c# odbc db2 parameterized-query

我正在尝试使用客户端访问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驱动程序支持参数化查询,但此错误似乎表明不是这样。提供的代码有什么问题吗?

2 个答案:

答案 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不是参数。它们是参数的占位符。

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

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

所以更完整的例子是

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();

}