【问题标题】:Access DB Transaction on insert or updating在插入或更新时访问数据库事务
【发布时间】:2013-06-24 16:18:25
【问题描述】:

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

}

【问题讨论】:

    标签: c# transactions ms-access-2007


    【解决方案1】:

    我注意到几件事:

    1. 您的 INSERT CommandText 指定了一个 @Country 参数,但您没有将相应的参数添加到 .Parameters 集合中。

    2. 您尝试通过更改 CommandText 并添加更多参数来为您的 UPDATE 重新使用 command 对象,但是您并没有从 INSERT 中删除以前的参数,所以大概它们仍在位置,这肯定会混淆 UPDATE 命令。

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

      李>

    我也很困惑:

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

    • 为什么需要事务,因为 INSERT 和 UPDATE 似乎无关。

    【讨论】:

      猜你喜欢
      • 2013-11-12
      • 1970-01-01
      • 2017-07-28
      • 1970-01-01
      • 2014-08-26
      • 1970-01-01
      • 2015-04-13
      • 2021-06-22
      • 1970-01-01
      相关资源
      最近更新 更多