【发布时间】:2011-11-02 04:47:59
【问题描述】:
我正在调试一个数据库操作代码,我发现虽然代码从未失败,但正确的 UPDATE 从未发生过。这是代码:
condb.Open();
OleDbCommand dbcom = new OleDbCommand("UPDATE Word SET word=?,sentence=?,mp3=? WHERE id=? AND exercise_id=?", condb);
dbcom.Parameters.AddWithValue("id", wd.ID);
dbcom.Parameters.AddWithValue("exercise_id", wd.ExID);
dbcom.Parameters.AddWithValue("word", wd.Name);
dbcom.Parameters.AddWithValue("sentence", wd.Sentence);
dbcom.Parameters.AddWithValue("mp3", wd.Mp3);
但经过一些调整后,它起作用了:
condb.Open();
OleDbCommand dbcom = new OleDbCommand("UPDATE Word SET word=?,sentence=?,mp3=? WHERE id=? AND exercise_id=?", condb);
dbcom.Parameters.AddWithValue("word", wd.Name);
dbcom.Parameters.AddWithValue("sentence", wd.Sentence);
dbcom.Parameters.AddWithValue("mp3", wd.Mp3);
dbcom.Parameters.AddWithValue("id", wd.ID);
dbcom.Parameters.AddWithValue("exercise_id", wd.ExID);
为什么在 OleDb 连接的情况下必须将 WHERE 子句中的参数放在最后一个如此重要?之前使用过 MySQL,我可以(并且通常会)首先编写 WHERE 子句的参数,因为这对我来说更合乎逻辑。
一般查询数据库时参数顺序重要吗?一些性能问题或其他什么?
对于其他数据库(如 DB2、Sqlite 等)是否需要维护特定的顺序?
更新:我摆脱了 ? 并包含了带有和不带有 @ 的专有名称。顺序真的很重要。在这两种情况下,只有最后提到 WHERE 子句参数时,才会发生实际更新。更糟糕的是,在复杂的查询中,我们很难知道 Access 期望哪个顺序,并且在顺序发生更改的所有情况下,查询都不会在没有警告/错误的情况下完成其预期任务!!
【问题讨论】:
-
你的查询模板是不是缺少一些语法来给参数槽命名?在没有名称的情况下,库可能会假设您希望按照它们出现的顺序填写它们。您是否希望数据库引擎随机选择出现在模板中
?附近的单词并假设这是您要为其使用的名称? -
@Henning Makholm 哦,可能就是这样。让我看看是不是..
-
@Henning Makholm ,不,那不是问题。我摆脱了
?并包含了带有和不带有@的专有名称。顺序真的很重要。在这两种情况下,只有最后提到 WHERE 子句参数时,才会发生实际更新。可能与 OleDbCommand 类有关。 -
“可能与 OleDbCommand 类有关。” - 它与 OLEDB 本身有关。参数是严格定位的。在大多数(如果不是全部)情况下,我们可以为参数分配名称(而不是全部调用
"?"),但这些名称被忽略。
标签: c# database ms-access oledbcommand dbcommand