用于 MS Access 更新表的 OleDbDataAdapter,为啥我的更新不起作用?

Posted

技术标签:

【中文标题】用于 MS Access 更新表的 OleDbDataAdapter,为啥我的更新不起作用?【英文标题】:OleDbDataAdapter for MS Access updating table, why doesn't my update work?用于 MS Access 更新表的 OleDbDataAdapter,为什么我的更新不起作用? 【发布时间】:2012-05-02 22:13:36 【问题描述】:

我不确定我在这里做错了什么——在调试器中,对文件名所做的更改是正确地对我从更新命令中提取的数据集进行的,但是当我检查之后数据库没有进行任何更改...所以我有点困惑...

using (System.Data.OleDb.OleDbConnection con = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" +
                               "Data Source=J:\\Physics.mdb"))
        
            using (OleDbDataAdapter dbAdapter = new OleDbDataAdapter("select thesisID, filename FROM Theses", con))
            

                DataSet ds = new DataSet();
                con.Open();
                dbAdapter.Fill(ds);

                for (int j = 0; j < ds.Tables[0].Rows.Count; j++)
                
                    ds.Tables[0].Rows[j]["filename"] = ds.Tables[0].Rows[j]["filename"].ToString().Replace(',', '_');
                    string newFileName = ds.Tables[0].Rows[j]["filename"].ToString();
                    int ID = Convert.ToInt32(ds.Tables[0].Rows[j]["thesisID"].ToString());
                    using (OleDbCommand updateCommand = con.CreateCommand())
                    
                       updateCommand.CommandText = "update theses set filename = @newFileName where thesisID = @ID";
                        updateCommand.Parameters.AddWithValue("@ID", ID);
                        updateCommand.Parameters.AddWithValue("@newFileName", newFileName);

                        updateCommand.ExecuteNonQuery();


                    



                
                con.Close();
                

        

【问题讨论】:

反转参数添加的顺序!恐怕这是 OleDBCommand 的本质 - 请参阅***.com/questions/1476770/…。其他数据提供者,如 SqlClient,支持命名参数,你的代码就可以了。 感谢@MichaelTodd 的建议。我不知道封闭的问题仍然是“可访问的” 【参考方案1】:

尝试颠倒添加参数的顺序:

using (OleDbCommand updateCommand = con.CreateCommand()) 
 
   updateCommand.CommandType = CommandType.Text;
   updateCommand.CommandText = "update theses set filename = @newFileName where thesisID = @ID"; 
   updateCommand.Parameters.AddWithValue("@newFileName", newFileName);
   updateCommand.Parameters.AddWithValue("@ID", ID);   
   updateCommand.ExecuteNonQuery(); 
 

原因是OleDb doesn't support named parameters,所以添加它们的顺序很重要。

请注意,OleDb 查询通常以这种方式表示:

using (OleDbCommand updateCommand = con.CreateCommand()) 
 
   updateCommand.CommandType = CommandType.Text;
   updateCommand.CommandText = "update theses set filename = ? where thesisID = ?"; 
   updateCommand.Parameters.Add(new OleDbParameter("", "", ""...));
   updateCommand.Parameters.Add(new OleDbParameter("", "", ""...));
   updateCommand.ExecuteNonQuery(); 
 

这强调了顺序很重要——问号只是占位符,按照参数添加到命令的顺序被替换。

【讨论】:

以上是关于用于 MS Access 更新表的 OleDbDataAdapter,为啥我的更新不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

MS-Access - 使用加入另一个表的结果更新列

如何从 MS access 2007 中的特定表中选择索引

如何通过 MS ACCESS 表执行 SQL Server 表的批量更新

引用其他表的 SQL MS Access 条件更新查询

迁移到新的 SQL Server 后,在 MS Access 中更新链接表的最佳方法是啥?

跨表的 MS Access 年龄计算