这是防止失败的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为浮点数,等等)?
不能在同一个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
}
}
}