OleDbDataAdapter for MS Access 更新表,为什么我的更新不起作用

本文关键字:更新 为什么 我的 不起作用 MS Access OleDbDataAdapter for | 更新日期: 2023-09-27 18:33:11

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

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();
                }
        }

OleDbDataAdapter for MS Access 更新表,为什么我的更新不起作用

尝试反转添加参数的顺序:

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 不支持命名参数,因此添加它们的顺序很重要。

请注意,通常经常看到 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(); 
} 

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