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

Parametric 'UPDATE' string running with no errors but not doing anything

我最近将更新 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();

参数设置正确,从现在开始window(我只展示了第一个,但第二个结构相同):

>>> 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 ++ ìì''' "

但是,虽然第一个代码片段以前可以工作,但新的代码片段不能。没有出现错误,执行正常,但数据库中的值没有更新。有谁知道可能出了什么问题?我可能忘记做某事了吗? 很抱歉这个愚蠢的问题,但我真的只有这个,无法弄清楚出了什么问题。

我终于解决了我的问题,很奇怪的事情。我会在这里添加一个答案,以防将来有人发现它有帮助。

基本上,问题在于参数添加到 OleDbCommand object 的 Parameters collection 的顺序。

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

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"

但是,我在 mySerial之前使用myString ,所以基本上结果查询是:

UPDATE myTable SET MY_FIELD = mySerial WHERE F_SERIAL = myString

我想说,这有点奇怪,因为使用参数名称(例如 @myString@mySerial 的原因是什么,如果代码仅取决于它们在 [= 中的位置12=] collection?

不过好吧,现在问题已经解决了,显然其他人已经遇到了同样的问题here。正如问题的提问者正确地说的那样,OleDb 可以识别出 您正在使用参数 但不能识别 您正在使用什么参数 (? ??),所以一切都只取决于它们在列表中的存储顺序。

对于 "useless" 的问题,我深表歉意,但我希望至少答案可能对像我这样的人有用,将来可能会因为看似正确的代码无法正确执行而花费数小时进行调试只是因为参数在其列表中的顺序。