这是防止失败的DB提交的最佳方法吗?

本文关键字:最佳 方法 提交 DB 失败 | 更新日期: 2023-09-27 18:06:17

我有一个遗留方法,它一直抛出异常。它有一个嵌套的try|catch。这是最好的编码方式吗?

public void DBCommand(string dynSQL, bool Silent)
{
    checkConnection(); //Despite the name, this "returns" void, not bool
    SqlCeCommand cmd = objCon.CreateCommand();
    SqlCeTransaction trans = GetConnection().BeginTransaction();
    cmd.Transaction = trans;
    try
    {
        cmd.CommandText = dynSQL;
        cmd.ExecuteNonQuery();
        trans.Commit();
    }
    catch (Exception ex)
    {
        try 
        {
            trans.Rollback();
        }
        catch (SqlCeException sqlceex) 
        {
            MessageBox.Show(string.Format("SqlCeException ({0})", sqlceex.Message));
            CCR.LogMsgs.Append(string.Format("SqlCeException exception: {0}'r'n", sqlceex.Message));
            // Handle possible Rollback exception here
        }
        MessageBox.Show(string.Format("DBCommand Except ({0})", ex.Message));
        CCR.LogMsgs.Append(string.Format("DBCommand exception: {0}'r'n", ex.Message));
    }
}

?

我想对其进行重构,以便至少对SqlCeCommand使用using语句,但目前以上是"原样"代码。我看到了一般的异常消息("DBCommand Except"),而不是"SqlCeException"

更新

通过添加一些MessageBox.Show()回调(由于某种原因不再写入调试日志文件),我发现这是抛出异常的DDL:

ALTER TABLE CCR032713190114 ADD salvationId nvarchar(19), salvation float

注意:"CCR032713190114"在代码中已经被证明是一个有效的表名(它存在)。

这个DDL有什么问题会导致问题吗?

更新2

我把代码改成了:

ddl = string.Format("ALTER TABLE {0} ADD salvationID nvarchar(19) ", tablename);
dbconn.DBCommand(ddl,false);
ddl = string.Format("UPDATE {0} SET salvationID = {1}", tablename, string.Empty);

…:

ddl = string.Format("ALTER TABLE {0} ADD salvationID nvarchar(19) NOT NULL WITH DEFAULT", tablename);
dbconn.DBCommand(ddl,false);

…但是现在,就在"ALTER TABLE BLA ADD salvation float NOT NULL WITH DEFAULT"之后,DBCommand Except(有一个错误解析查询)。[令牌行号,令牌行偏移量,,令牌错误,,])"

Azure的火盆里发生了什么?

我是否需要在"WITH default"(不会)或字符串之后指定一个默认值?空自动为nvarchar列的默认值,0.0为浮点数,等等)?

这是防止失败的DB提交的最佳方法吗?

不能在同一个ALTER TABLE语句中添加两个列,每次只能添加一个,最好指定NULL或NOT NULL(如果NOT NULL,可能需要DEFAULT)

如果您从未见过SqlCeException,那么它将是真正的例外。为了让它"不碍事",我会这样做:

public void DBCommand(string dynSQL, bool Silent) {
    checkConnection(); //Despite the name, this "returns" void, not bool
    SqlCeCommand cmd = objCon.CreateCommand();
    SqlCeTransaction trans = GetConnection().BeginTransaction();
    cmd.Transaction = trans;
    var doRollback = false;
    try {
        cmd.CommandText = dynSQL;
        cmd.ExecuteNonQuery();
        trans.Commit();
    }
    catch (Exception ex) {
        doRollback = true
        MessageBox.Show(string.Format("DBCommand Except ({0})", ex.Message));
        CCR.LogMsgs.Append(string.Format("DBCommand exception: {0}'r'n", ex.Message));
    }
    finally {
        if(doRollback) }
            DoRollback();
        }
    }
}
void DoRollback(){
    try {
        trans.Rollback();
    }
    catch (SqlCeException sqlceex)  {
        MessageBox.Show(string.Format("SqlCeException ({0})", sqlceex.Message));
        CCR.LogMsgs.Append(string.Format("SqlCeException exception: {0}'r'n", sqlceex.Message));
        // Handle possible Rollback exception here
    }
}

}