参数化更新'字符串运行没有错误但没有做任何事情

时间:2015-03-15 15:50:33

标签: c# sql ms-access oledb

我最近将更新SQL字符串从动态SQL字符串更改为参数化SQL字符串。这就是我之前所拥有的:

OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + this.DBstring);
OleDbCommand comm = new OleDbCommand();
comm.CommandText = "UPDATE myTable SET MY_FIELD='" + myString + "' WHERE F_SERIAL = '"+mySerial+"'";
comm.CommandType = CommandType.Text;
comm.Connection = conn;
conn.Open();
comm.ExecuteNonQuery();
conn.Close();

这就是我现在所拥有的:

OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + this.DBstring);
OleDbCommand comm = new OleDbCommand();
comm.CommandText = "UPDATE myTable SET MY_FIELD = @myString WHERE F_SERIAL = @mySerial";
comm.Parameters.Add("@mySerial",OleDbType.VarWChar).Value = mySerial;
comm.Parameters.Add("@myString",OleDbType.VarWChar).Value = myString;
comm.CommandType = CommandType.Text;
comm.Connection = conn;
conn.Open();
comm.ExecuteNonQuery();
conn.Close();

参数设置正确,如立即窗口(我只显示第一个,但第二个具有相同的结构):

>>> comm.Parameters[0];
{@myString}
    base {System.Data.Common.DbParameter}: {@myString}
    DbType: String
    Direction: Input
    IsNullable: false
    OleDbType: VarWChar
    ParameterName: "@myString"
    Precision: 0
    Scale: 0
    Size: 15
    SourceColumn: ""
    SourceColumnNullMapping: false
    SourceVersion: Current
    Value: "test ++ ìì''' "

然而,虽然之前使用的第一个代码片段,新的代码片段并不适用。不会引发错误,执行正常,但数据库中的值不会更新。有没有人知道可能出现什么问题?我可能忘了做某事吗? 抱歉这个愚蠢的问题,但我真的没有什么比这更好的了,也无法弄清楚是什么错。

1 个答案:

答案 0 :(得分:2)

我终于解决了我的问题,非常奇怪。我将在这里添加一个答案,以防有人在将来发现它有用。

基本上,问题是参数被添加到Parameters对象的OleDbCommand集合的顺序。

在我的代码中,我这样做:

comm.CommandText = "UPDATE myTable SET MY_FIELD = @myString WHERE F_SERIAL = @mySerial"; //<-- defining the command text
comm.Parameters.Add("@mySerial",OleDbType.VarWChar).Value = mySerial; //<-- parameter "mySerial" before "myString"
comm.Parameters.Add("@myString",OleDbType.VarWChar).Value = myString; //<-- parameter "myString" after "mySerial"

但是,我在 myString之前使用mySerial ,所以基本上生成的查询是:

UPDATE myTable SET MY_FIELD = mySerial WHERE F_SERIAL = myString

这个,我说,有点奇怪,因为使用参数的名称的原因是@myString@mySerial,如果那么只有代码取决于他们在Parameters集合中的定位?

但是,问题现在已经解决了,显然其他人已经面临同样的问题here。正如问题的提问者所说的那样,OleDb可以识别您正在使用参数而不是您正在使用的参数(? ??),使所有事情都只依赖于它们存储在列表中的顺序。

我为#34;无用的&#34;而道歉。问题,但我希望至少答案可能会变成对某些人有用,就像我一样,将来可能很难调试几个小时显然正确的代码因为参数而无法正常执行。在其列表中的顺序。