外部事件可以导致打开的DbConnection关闭吗?

时间:2016-01-23 21:32:04

标签: .net oledbconnection

我的方案是我正在创建一个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()事件意味着我立即得到通知,数据库现在无法访问,那么我可以对此做些什么。否则我必须在提交/回滚时处理它。再次,谢谢。

1 个答案:

答案 0 :(得分:0)

我希望我能正确理解你的问题。通常,您打开连接,提交事务,然后检查是否有任何行受到影响。如果0行返回,那么你就知道没有提交任何行,你可以再试一次,或者......而且,如果你将整个事物包装在“try> catch”中,那么你可以进一步捕获错误。

如果你打开一个连接然后关闭连接(由于某些外部原因)然后你尝试提交命令,将抛出一个错误,你可以捕获它。

“try> catch”将捕获错误(如果它们发生)并且“int result ...”将显示您的更改是否已提交。

https://msdn.microsoft.com/en-us/library/system.data.oledb.oledbcommand.executenonquery(v=vs.110).aspx

类似的东西:

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.
}