Как реализовать транзакционный путь в vb.net? - PullRequest
0 голосов
/ 18 ноября 2008

Я разрабатываю одно приложение с использованием VB.net (200%), которое подключается к базе данных MS-Access, я использую TableAdapter и Dataset для подключения к файлу Access DB.

Мне нужно реализовать простой метод транзакции (фиксация, откат) при сохранении в БД?

Есть ли способ сделать это без необходимости использовать встроенный оператор SQL?

Спасибо

Ответы [ 2 ]

10 голосов
/ 18 ноября 2008

Пока я читаю, Microsoft Jet (Access DB Engine) поддерживает транзакции. Таким образом, вы можете создать такую ​​транзакцию (пример из 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();

Более простой способ (пример из 15 секунд ):

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;

}

Вам понадобится MSDTC на вашем компьютере, если вы используете TransactionScope .

К сожалению TableAdapter не предоставляет свойство соединения , поэтому вам нужно обойти это решение. Так что вам нужен обходной путь:

1) Отражение (пример формы 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();

Отражение может быть очень медленным!

2) TransactionScope (пример формы 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();
   }

Вам понадобится MSDTC!

0 голосов
/ 18 ноября 2008

Вы можете найти множество учебников по доступу к данным на http://www.asp.net/learn/data-access/

...