我使用连接到MS-Access数据库的VB.net(200%)开发了一个应用程序,我使用TableAdapter和Dataset连接到Access DB文件.
我需要在保存到DB时实现一个简单的事务方法(commit,rollback)吗?
有没有办法在不需要使用内联SQL语句的情况下执行此操作?
谢谢,
正如我读到的Microsoft Jet(Access数据库引擎)支持事务.因此,您可以创建这样的事务(来自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; }
如果您使用的是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!