事务支持
规则引擎通常不支持事务。 但是,可以使用 DataConnection 对象以事务方式更新数据库,如以下步骤所示:
使用连接字符串创建 SqlConnection 对象,然后打开连接。
SqlConnection connection = new SqlConnection("Initial Catalog=Northwind;Data Source=(local);Integrated Security=SSPI;"); connection.Open();
通过在步骤 1 中创建的连接对象上调用 BeginTransaction 方法创建 SqlTransaction 对象。
SqlTransaction transaction = connection.BeginTransaction();
使用在步骤 1 和步骤 2 中创建的连接和事务对象创建 DataConnection 对象。
DataConnection dc = new DataConnection(datasetName, tableName, connection, transaction);
将 DataConnection 对象作为事实以及要传递给策略的任何其他事实一起传递,并执行策略。
//Passing a .NET object as a fact along with the data connection MyClass obj = new MyClass(); object[] facts = new object[2]; facts[0] = dc; facts[1] = obj; Policy pol = new Policy(policyName); policy.Execute(facts);
对数据连接对象调用 Update 方法。 执行策略时,所进行的所有更新都是在内存中完成的。 必须对数据连接对象调用 Update 方法才能更新数据库。
dc.Update();
现在,请根据自己的逻辑对数据连接对象调用 Commit 或 Rollback 。
//Checking the value of PropertyA in .net object //to decide whether to commit or rollback if (obj.PropertyA == true) transaction.Commit(); else transaction.Rollback();
关闭连接,并释放策略对象。
sqlCon.Close(); policy.Dispose();
下列代码是上述所有步骤的完整代码:
SqlConnection connection = new SqlConnection("Initial Catalog=Northwind;Data Source=(local);Integrated Security=SSPI;");
connection.Open();
SqlTransaction transaction = connection.BeginTransaction();
DataConnection dc = new DataConnection(datasetName, tableName, connection, transaction);
MyClass obj = new MyClass();
object[] facts = new object[2];
facts[0] = dc;
facts[1] = obj;
Policy pol = new Policy(policyName);
policy.Execute(facts);
dc.Update();
if (obj.PropertyA == true)
transaction.Commit();
else
transaction.Rollback();
sqlCon.Close();
policy.Dispose();
注释
还可以使用 OleDbConnection 和 OleDbTransaction 对象,而不是使用 SqlConnection 和 SqlTransaction 对象以事务方式执行数据库更新。
所有通过策略进行的修改都是在内存中完成的。 必须对 DataConnection 对象调用 Update 方法以更新数据库。
可以通过分别调用 DataConnection 对象的 Commit 或 Rollback 方法提交或回滚事务。