1

ここで間違って何をしているのかわかりません-デバッガーでは、ファイル名に加えられた変更は、更新コマンドのためにプルしているデータセットに正しく行われますが、後でデータベースをチェックすると、変更が行われたので、少し混乱しています...

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

        }
4

1 に答える 1

4

パラメータを追加する順序を逆にしてみてください。

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

これは、順序が重要であることを強調しています。疑問符は、コマンドにパラメーターが追加される順序で置き換えられる単なるプレースホルダーです。

于 2012-05-02T22:25:55.950 に答える