我的方案是我正在创建一个OleDbTransaction
,稍后将被提交或回滚。由于相应的OleDbConnection
需要在事务的生命周期内保持打开状态,我想知道是否某些外部事件(例如SQL Server崩溃或我的网络连接断开)会导致连接关闭?我知道我可以监听DbConnection.StateChange
个事件,但是如果能够改变连接状态的唯一代码是我自己的,那么我不需要大惊小怪。感谢。
修改
以下是为问题添加其他上下文的一些代码:
public class DBAccess {
private OleDbConnection cn = null;
private OleDbTransaction tn = null;
private const string cnString = "my connection string";
public void UpdateField(string fieldName, object data, int key) {
if (tn == null) {
cn = new OleDbConnection(cnString);
cn.StateChange += Connection_StateChange;
tn = cn.BeginTransaction();
}
OleDbCommand cmd = new OleDbCommand("UPDATE MYTABLE SET " + fieldname + "=" + data.ToString() + "WHERE TABLEKEY=" + key, cn, tn);
if (cmd.ExecuteNonQuery() != 1) {
throw new ApplicationException();
}
}
public void Commit() {
if (tn != null) {
tn.Commit();
cn.Close();
tn = null;
}
}
public void Rollback() {
if (tn != null) {
tn.Rollback();
cn.Close();
tn = null;
}
}
private void Connection_StateChange(object sender, StateChangeEventArgs e) {
// can anything other than my code calling cn.Close() get me here?
}
在我的应用程序中,用户可能会在一段时间内对表中的不同字段进行一些更改...每个字段都会单独调用UpdateField()
。当他们准备好保存他们的更改时,他们会按下保存按钮,代码会调用我班级的Commit()
方法......还会有一个丢弃更改按钮,这会导致调用我班级的{{ 1}}方法。因此,连接和交易需要在一段时间内保持开放。在此期间,与数据库的连接可能会发生某些事件,导致提交或回滚失败。如果注册Rollback()
事件意味着我立即得到通知,数据库现在无法访问,那么我可以对此做些什么。否则我必须在提交/回滚时处理它。再次,谢谢。
答案 0 :(得分:0)
我希望我能正确理解你的问题。通常,您打开连接,提交事务,然后检查是否有任何行受到影响。如果0行返回,那么你就知道没有提交任何行,你可以再试一次,或者......而且,如果你将整个事物包装在“try> catch”中,那么你可以进一步捕获错误。
如果你打开一个连接然后关闭连接(由于某些外部原因)然后你尝试提交命令,将抛出一个错误,你可以捕获它。
“try> catch”将捕获错误(如果它们发生)并且“int result ...”将显示您的更改是否已提交。
类似的东西:
try
{
//....
int result = myOleDBCommand.ExecuteNonQuery();
if (result <= 0) { /*the command executed but, nothing changed on the datasource so you can decide what to do here*/ }
}
catch (Exception ex)
{
//if you get here then a problem has occurred and you can choose how to deal with it.
}