使用C#、MS Access及VS数据集设计器实现事务的方法咨询
Access + 数据集设计器实现事务操作方案
可以实现事务,TransactionScope无法使用是因为ACE/OleDb驱动不支持ITransactionLocal接口,但我们可以用OleDb原生事务结合数据集设计器的TableAdapter来实现多插入的事务控制。
核心思路
数据集设计器生成的TableAdapter默认会自动打开/关闭连接,但要实现事务,需要手动控制连接实例,并让所有参与事务的TableAdapter共享同一个连接和事务对象。
代码示例
假设你有两个用于插入操作的TableAdapter:CustomerTableAdapter 和 OrderTableAdapter,以下是完整的事务实现代码:
// 从配置文件或TableAdapter中获取Access连接字符串 string connString = Properties.Settings.Default.MyAccessDBConnectionString; // 手动管理连接和事务 using (OleDbConnection conn = new OleDbConnection(connString)) { conn.Open(); OleDbTransaction transaction = null; try { // 开启事务 transaction = conn.BeginTransaction(); // 初始化TableAdapter并绑定连接和事务 using (CustomerTableAdapter customerAdapter = new CustomerTableAdapter()) using (OrderTableAdapter orderAdapter = new OrderTableAdapter()) { // 覆盖TableAdapter的默认连接 customerAdapter.Connection = conn; orderAdapter.Connection = conn; // 绑定事务到每个TableAdapter customerAdapter.Transaction = transaction; orderAdapter.Transaction = transaction; // 执行第一条插入 customerAdapter.Insert("张三", "138XXXX1234"); // 执行第二条插入 orderAdapter.Insert("20240520001", DateTime.Now, 1); // 所有操作成功,提交事务 transaction.Commit(); } } catch (Exception ex) { // 出错时回滚事务 transaction?.Rollback(); Console.WriteLine($"事务执行失败:{ex.Message}"); throw; // 按需处理异常 } }
关键注意事项
- 所有参与事务的TableAdapter必须共享同一个OleDbConnection实例,并绑定同一个OleDbTransaction对象。
- 必须手动打开连接,否则TableAdapter会自动创建新连接,导致事务失效。
- 异常处理中务必执行事务回滚,避免数据不一致。
- 操作完成后,using语句会自动关闭连接,无需手动调用
conn.Close()。
内容的提问来源于stack exchange,提问作者SerialCoder
相关产品推荐
相关产品推荐

