数据库Command对象的参数顺序真的很重要吗?

naw*_*fal 4 c# database ms-access oledbcommand dbcommand

我正在调试一个数据库操作代码,我发现虽然代码永远不会失败,但从未发生过正确的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);
Run Code Online (Sandbox Code Playgroud)

但经过一些调整后,这个工作:

        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);
Run Code Online (Sandbox Code Playgroud)
  1. 为什么在OleDb连接的情况下必须在WHERE子句中给出最后一个参数是如此重要?之前使用过MySQL,我可以(并且通常会)首先编写WHERE子句的参数,因为这对我来说更合乎逻辑.

  2. 一般查询数据库时参数顺序是否重要?一些性能问题还是什么?

  3. 是否有其他数据库(如DB2,Sqlite等)需要维护的特定顺序?

更新:我删除?并包括有和没有的专有名称@.订单非常重要.在这两种情况下,只有在最后提到WHERE子句参数时才会发生实际更新.更糟糕的是,在复杂的查询中,很难知道自己哪个订单是Access期望的,并且在订单被更改的所有情况下,查询都没有完成预期的任务而没有警告/错误!

Han*_*sUp 5

在Access中,ADODB.Command对象忽略参数名称.实际上我可以使用伪名称(在SQL语句中甚至不存在)引用参数,而ADO并不关心.似乎所关心的是,您提供的参数值的顺序与SQL语句中出现的参数的顺序完全相同.顺便说一下,如果我使用?占位符而不是命名参数构建SQL语句,也会发生这种情况.

虽然我意识到你的问题是关于c#的OleDbCommand,但在我看来,像Dot.Net这样的OleDbCommand操作可能和Access一样ADODB.Command.不幸的是,我不知道Dot.Net ......但那是我的预感.:-)