1

我有一个遗留方法不断抛出异常。它有一个嵌套的 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 等)?

4

2 回答 2

2

您不能在同一个 ALTER TABLE 语句中添加两列,必须一次添加一列,指定 NULL 或 NOT NULL 也是一个好主意(如果 NOT NULL,可能需要 DEFAULT)

于 2013-03-28T09:04:46.153 回答
1

如果您从未见过,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
    }
}

}

于 2013-03-27T23:00:36.470 回答