如何在 vb.net 中实现交易方式?

Posted

技术标签:

【中文标题】如何在 vb.net 中实现交易方式?【英文标题】:How to implement transaction way in vb.net? 【发布时间】:2008-11-18 08:59:06 【问题描述】:

我使用连接到 MS-Access 数据库的 VB.net (200%) 开发了一个应用程序,我使用 TableAdapter 和 Dataset 连接到 Access DB 文件。

我需要实现一个简单的事务方法(提交、回滚)来保存到数据库?

有没有办法做到这一点而不需要使用内联 SQL 语句?

谢谢,

【问题讨论】:

您将 MDB 用作数据存储,因此只涉及 Jet -- Access 与您的问题无关。 【参考方案1】:

正如我所读,Microsoft Jet(Access DB 引擎)支持事务。所以你可以像这样创建一个事务(来自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 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;


如果您使用 TransactionScope,则需要在您的计算机上运行 MSDTC。

不幸的是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!

【讨论】:

TableAdapters 可以公开一个连接属性,如果您在设计器中右键单击适配器,转到属性,然后将 ConnectionModifier 属性更改为 Public。我使用它来允许我为多个表适配器共享单个连接,因此在使用 TransactionScope 时防止升级到 DTC。 哇,对于一个再也没有回来过的人来说,这是一项非常棒的工作。【参考方案2】:

你可以在http://www.asp.net/learn/data-access/找到一堆数据访问教程

【讨论】:

以上是关于如何在 vb.net 中实现交易方式?的主要内容,如果未能解决你的问题,请参考以下文章

如何在选择案例语句中实现枚举

在 VB.NET 中实现 bittrex API

如何在 laravel 中实现诸如 Fiverr 之类的信用卡和贝宝交易

如何在水晶报告中实现这一目标?

C#/VB.NET Excel数据分列

使用 C#/VB.NET 实现 SQL Server Profiler