我有一个遗留方法不断抛出异常。它有一个嵌套的 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 除外”),而不是“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 save float NOT NULL WITH DEFAULT ”之后,我看到了这个错误消息,“ DBCommand 除外(解析查询时出错。[令牌行号,令牌行偏移量,,令牌错误,,]) "
Azure braziers 里发生了什么?
我是否需要在“WITH DEFAULT”之后指定默认值('' 或 string.empty 不会自动成为 nvarchar 列的默认值,浮点数为 0.0 等)?