插入或更新时访问数据库事务

本文关键字:数据库 事务 访问 更新 插入 | 更新日期: 2023-09-27 18:19:46

我将使用C#实现Window应用程序的数据库访问层。数据库(.accdb)位于项目文件中。当两个笔记本电脑(客户端)通过交换机连接到一个访问数据库时,会引发DBConcurrency异常错误。我的目标是先检查执行的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();
        }
}

插入或更新时访问数据库事务

我注意到两件事:

  1. INSERT CommandText指定了@Country参数,但没有向.Parameters集合添加相应的参数。

  2. 您试图通过更改CommandText和添加更多参数来为UPDATE重用command对象,但您没有从INSERT中删除以前的参数,所以它们可能仍然存在,这肯定会混淆UPDATE命令。

  3. 您以错误的顺序指定UPDATE参数。ACE.OLEDB忽略参数名称,因此参数必须按在CommandText中出现的确切顺序添加到.Parameters集合。

我也很困惑:

  • 为什么在尝试绑定GridView和之前不提交事务

  • 为什么您需要一个事务,因为INSERT和UPDATE看起来是不相关的。