我的场景是我正在创建一个稍后将提交或回滚的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()
方法......还将有一个"放弃更改"按钮,该按钮会导致调用我的类的Rollback()
方法。 因此,连接和事务需要在一段时间内保持打开状态。 在此期间,与数据库的连接可能会发生某些情况,从而导致提交或回滚失败。 如果注册 StateChange
事件意味着我立即收到数据库现在无法访问的通知,那么我可以对此执行一些操作。 否则,我必须在提交/回滚时处理它。 再次,谢谢。
我希望我正确理解了你的问题。 通常,您打开连接,提交事务,然后检查是否有任何行受到影响。 如果返回 0 行,那么您知道没有提交任何行,您可以重试,或者...... 此外,如果你把整个事情包装在一个"尝试捕捉"中>那么你就可以进一步捕捉错误。
如果您打开一个连接,然后连接被关闭(由于某些外部原因),然后您尝试提交命令,将抛出一个错误,您可以在 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.
}