How to implement transaction way in vb.net?

前端 未结 2 1962
逝去的感伤
逝去的感伤 2021-01-26 20:09

I develop one application using VB.net (200%) that connects to MS-Access Database, I use TableAdapter and Dataset for connection to the Access DB file.

I need to impleme

相关标签:
2条回答
  • 2021-01-26 20:55

    You can find a bunch of data access tutorials at http://www.asp.net/learn/data-access/

    0 讨论(0)
  • 2021-01-26 20:56

    As I read Microsoft Jet (Access DB Engine) supports transactions. So you can create a transaction like this (example from CodeProject):

          SqlConnection db = new SqlConnection("connstringhere");
          SqlTransaction transaction;
    
          db.Open();
          transaction = db.BeginTransaction();
          try 
          {
             new SqlCommand("INSERT INTO TransactionDemo " +
                "(Text) VALUES ('Row1');", db, transaction)
                .ExecuteNonQuery();
             new SqlCommand("INSERT INTO TransactionDemo " +
                "(Text) VALUES ('Row2');", db, transaction)
                .ExecuteNonQuery();
             new SqlCommand("INSERT INTO CrashMeNow VALUES " +
                "('Die', 'Die', 'Die');", db, transaction)
                .ExecuteNonQuery();
             transaction.Commit();
          } 
          catch (SqlException sqlError) 
          {
             transaction.Rollback();
          }
          db.Close();
    

    An easier way is (example from 15 Seconds):

    bool IsConsistent = false;
    
    using (System.Transactions.TransactionScope ts = new System.Transactions.TransactionScope())
    
    {
    
          SqlConnection cn = newSqlConnection(CONNECTION_STRING );
    
          string sql = "DELETE Categories";
    
          SqlCommand cmd = newSqlCommand(sql, cn);
    
          cn.Open();
    
          cmd.ExecuteNonQuery();
    
          cn.Close();
    
          //Based on this property the transaction will commit if
    
          //successful.  If it fails however, this property will
    
          //not be set and the transaction will not commit.
    
          ts.Consistent = IsConsistent;
    
    }
    

    You will need MSDTC running on your machine if you are using TransactionScope.

    Unfortunately TableAdapter does not expose a connection property, so you need a workaround. So you need some workaround:

    1) Reflection (example form CodeProject)

    conn = new SqlConnection(Properties.Settings.Default.NorthwindConnectionString);
    conn.Open();
    trans = conn.BeginTransaction();
    1. 
    public SqlDataAdapter GetAdapter(object tableAdapter)
    {
        Type tableAdapterType = tableAdapter.GetType();
        SqlDataAdapter adapter = (SqlDataAdapter)tableAdapterType.GetProperty("Adapter", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(tableAdapter, null);
            return adapter;
    }
    2.
    adapter.InsertCommand.Connection = trans.Connection;
    adapter.UpdateCommand.Connection = trans.Connection;
    adapter.DeleteCommand.Connection = trans.Connection;
    
    3.
    adapter.InsertCommand.Transaction = trans;
    adapter.UpdateCommand.Transaction = trans;
    adapter.DeleteCommand.Transaction = trans;
    
    4. 
    -
    
    5. 
    trans.commit();
    

    Reflection can be very slow!

    2) TransactionScope (example form DevX.com)

        CustomersDataSet.CustomersDataTable customers = new CustomersDataSet.CustomersDataTable();
       CustomersDataSetTableAdapters.CustomersTableAdapter tblAdap = new 
          CustomersDataSetTableAdapters.CustomersTableAdapter();
       using (TransactionScope txScope = new TransactionScope())
       {
           tblAdap.Fill(customers);
           customers.Rows[0]["ContactName"] = "Maria Velasquez";
           tblAdap.Update(customers);
           txScope.Complete();
       }
    

    You will need MSDTC!

    0 讨论(0)
提交回复
热议问题