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 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 braziers で何が起こっているのでしょうか?

「WITH DEFAULT」の後にデフォルトの val を指定する必要がありますか?

4

2 に答える 2

2

同じ ALTER TABLE ステートメントに 2 つの列を追加することはできません。一度に 1 つずつ追加する必要があります。また、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 に答える