2

作成したデータベースを更新するアプリケーションを作成しています。アプリケーションには、データベースからのデータを表示する datagridview があります。アプリで非常に奇妙なことが起こっています。

データベースを更新するコードは次のとおりです

string updateCommandString = "UPDATE RoomsTable SET [Date Checked]=@checkedDate WHERE      ID = @id"; 
using (OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\users\spreston\documents\visual studio 2012\Projects\roomChecksProgram\roomChecksProgram\roomsBase.accdb"))
{
    using (OleDbCommand updateCommand = new OleDbCommand())
    {
        updateCommand.Connection = conn;
        updateCommand.CommandText = updateCommandString;
        updateCommand.CommandType = CommandType.Text;
        updateCommand.Parameters.AddWithValue("@checkedDate", 
            this.dateTimePicker1.Value.ToShortDateString());
        updateCommand.Parameters.AddWithValue("@id", row.roomID);
        try
        {
            conn.Open();
            updateCommand.ExecuteNonQuery();
            conn.Close();
            conn.Dispose();
        }
        catch(OleDbException ex)
        {
            MessageBox.Show(ex.Message.ToString());
        }
    }
}

そのコードを実行し、アプリを閉じてアプリを再度実行すると、データベースに接続されているデータグリッドビューに変更が正しく表示されますが、実際のデータベースを見ると、何も変更されていません。なぜこれが起こっているのかわかりません。

私のSQL更新は、データグリッドビューに接続されているデータベースを更新します。Sow HOW は正しいデータを表示するデータグリッド ビューですが、データベース自体は表示しません。

編集:私はこれまでSQLの経験がありませんでした。

編集: トランザクション コード:

 string updateCommandString = "UPDATE RoomsTable SET [Date Checked]=@checkedDate WHERE ID = @id"; 
                using (OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\users\spreston\documents\visual studio 2012\Projects\roomChecksProgram\roomChecksProgram\roomsBase.accdb"))
                        {
                            OleDbTransaction transaction = null;
                         using (OleDbCommand updateCommand = new OleDbCommand())
                             {

                                    updateCommand.Connection = conn;
                                    updateCommand.Transaction = transaction;    
                                    updateCommand.CommandText = updateCommandString;
                                    updateCommand.CommandType = CommandType.Text;
                                    updateCommand.Parameters.AddWithValue("@checkedDate", this.dateTimePicker1.Value.ToShortDateString());
                                    updateCommand.Parameters.AddWithValue("@id", row.roomID);
                            try
                            {
                                conn.Open();
                                transaction = conn.BeginTransaction();
                                updateCommand.ExecuteNonQuery();
                                transaction.Commit();

                                conn.Close();
                                conn.Dispose();
                            }
                            catch(OleDbException ex)
                            {
                                MessageBox.Show(ex.Message.ToString());
                            }
                        }
                    }
4

2 に答える 2

1

考えられる理由:

  1. アプリケーションがデータベース ファイルのコピーに接続する場合があります。プロジェクト ディレクトリでデータベースのコピーを検索します (.accdb 拡張子?)
  2. David S が正しいかもしれませんが、データベースの変更をコミットする必要があります ( MSDN の OleDbTransaction ヘルプ)。分離設定を READ UNCOMMITTED に変更することは、問題に対する洗練されていないアプローチです。
于 2012-09-30T17:41:09.303 に答える
0

トランザクション分離の問題があるようです。このトピックに慣れていない場合は、Google で検索してドキュメントを読むことをお勧めします。READ COMMITTED がデフォルトだと思います... READ UNCOMMITTED に設定すると、更新が表示されないという問題がおそらく修正されます。ただし、これは実際には推奨される方法ではありません。一般に、情報を検査する前に、すべてのトランザクションがデータベースにコミットされていることを確認する必要があります。

追加メモ: アプリケーションのテスト中に、アプリケーションの外部の SQL ツールからデータベースにクエリを実行して何かをチェックできるようにする必要が時々ありました。ただし、ほぼ 15 年間 db アプリケーションを開発してきましたが、本番環境でこれを READ UNCOMMITTED に設定する必要はありませんでした。READ COMMITTED 以外で本番環境に移行することについては、非常に慎重です。あなたがそれを望む必要があるケースが決してないと言っているわけではありませんが、それは標準ではありません (私見)。

于 2012-09-30T17:28:05.737 に答える