-1

C# を使用して Window アプリケーションのデータベース アクセス層を実装します。データベース (.accdb) はプロジェクト ファイルにあります。スイッチを介して 1 つのアクセス データベースに接続する 2 つのノートブック (クライアント) になると、DBConcurrency Exception エラーがスローされます。私の目標は、最初に実行された sql のタイムスタンプを確認してから、 sql を実行することです。これを達成するためのガイドラインを教えてください。

以下は私のコードです

        protected void btnTransaction_Click(object sender, EventArgs e)
    {
        string custID = txtID.Text;
        string CompName = txtCompany.Text;
        string contact = txtContact.Text;
        string city = txtCity.Text;


        string connString = ConfigurationManager.ConnectionStrings["CustomersDatabase"].ConnectionString;
        OleDbConnection connection = new OleDbConnection(connString);
        connection.Open();
        OleDbCommand command = new OleDbCommand();
        command.Connection = connection;
        OleDbTransaction transaction = connection.BeginTransaction();
        command.Transaction = transaction;

        try
        {
            command.CommandText = "INSERT INTO Customers(CustomerID, CompanyName, ContactName, City, Country) VALUES(@CustomerID, @CompanyName, @ContactName, @City, @Country)";
            command.CommandType = CommandType.Text;
            command.Parameters.AddWithValue("@CustomerID", custID);
            command.Parameters.AddWithValue("@CompanyName", CompName);
            command.Parameters.AddWithValue("@ContactName", contact);
            command.Parameters.AddWithValue("@City", city);

            command.ExecuteNonQuery();

            command.CommandText = "UPDATE Customers SET ContactName = @ContactName2 WHERE CustomerID = @CustomerID2";
            command.CommandType = CommandType.Text;
            command.Parameters.AddWithValue("@CustomerID2", custIDUpdate);
            command.Parameters.AddWithValue("@ContactName2", contactUpdate);
            command.ExecuteNonQuery();

            adapter.Fill(table);
            GridView1.DataSource = table;
            GridView1.DataBind();

            transaction.Commit();
            lblMessage.Text = "Transaction successfully completed";
        }
        catch (Exception ex)
        {
            transaction.Rollback();
            lblMessage.Text = "Transaction is not completed";
        }
        finally
        {
            connection.Close();
        }

}
4

1 に答える 1

1

私はいくつかのことに気づきました:

  1. INSERT CommandText にはパラメーターが指定されていますが、対応するパラメーターをコレクション@Countryに追加していません。.Parameters

  2. commandCommandText を変更してパラメーターを追加することで、UPDATEにオブジェクトを再利用しようとしますが、INSERT から以前のパラメーターを削除しないため、おそらくそれらはまだ残っているため、UPDATE コマンドが間違いなく混乱する可能性があります。 .

  3. UPDATE パラメータを間違った順序で指定しています。ACE.OLEDBはパラメーター名を無視するため、CommandText に表示される正確な.Parameters順序でパラメーターをコレクションに追加する必要があります。

私も混乱しています:

  • GridView をバインドするにトランザクションをコミットしない理由、および

  • INSERT と UPDATE は無関係に見えるので、なぜトランザクションが必要なのか。

于 2013-06-24T20:01:25.497 に答える