首先,我想说的是我正在使用Firebird,不知道这是否与其他数据库服务器有关。
我要做的是将部分命令字符串作为参数传递。
我有这样的代码:
using (FbConnection con = new FbConnection(M.Baza.connectionString))
{
con.Open();
using (FbCommand cmd = new FbCommand("DELETE FROM STAVKA WHERE VRDOK = @VRDOK AND BRDOK = @BRDOK AND ROBAID IN (@ROBAID)", con))
{
cmd.Parameters.AddWithValue("@VRDOK", vrDok);
cmd.Parameters.AddWithValue("@BRDOK", brDok);
cmd.Parameters.AddWithValue("@ROBAID", robaId); //robaId is string which looks like this '15, 18, 16, 14, 28'
cmd.ExecuteNonQuery();
if (showMessage)
MessageBox.Show("Stavke uspesno obrisane!");
}
}
上面的代码不起作用,它会丢弃错误
无法将类型为“ system.Int32”的对象转换为类型为“ system.iconvertible”
但是当我编写这样的代码时:
using (FbConnection con = new FbConnection(M.Baza.connectionString))
{
con.Open();
using (FbCommand cmd = new FbCommand("DELETE FROM STAVKA WHERE VRDOK = @VRDOK AND BRDOK = @BRDOK AND ROBAID IN (" + robaId + ")", con))
{
cmd.Parameters.AddWithValue("@VRDOK", vrDok);
cmd.Parameters.AddWithValue("@BRDOK", brDok);
cmd.ExecuteNonQuery();
if (showMessage)
MessageBox.Show("Stavke uspesno obrisane!");
}
}
有效。
为什么会这样?
假设我有这样的命令"SELECT " + columns + " FROM TABLE"
,其中columns
是字符串类型,看起来像这样的column1, column2, column3
,并且可以正常工作。如何使相同的代码看起来像"SELECT @COLUMNS FROM TABLE"
并传递@COLUMNS
,就像我通过cmd.Parameters.AddWithValue("@COLUMNS", columns);
传递参数一样