4

SQL管理オブジェクトを使用してSQLサーバーに接続しています。現時点では、私の例では単純な「テーブルの作成」コマンドが含まれています。

このコードを意図的に2回実行して、「テーブルは既に存在します」というエラーを発生させます。

ただし、以下のイベントはトリガーされません。

誰かがアイデアを思いついたのですが、コードでこのメッセージを保持する方法を教えてください。それ以外の場合は、ExecutionTypeを変更して、例外の原因となるエラーで停止します(これはやりたくない、続行したい)

私のコード:

public void executeSomeSQL() {
    FileInfo file = new FileInfo(@"\c:\sqlcommands.sql");
    string script = file.OpenText().ReadToEnd();
    SqlConnection conn = new SqlConnection(sqlConnectionString);
    conn.InfoMessage +=new SqlInfoMessageEventHandler(conn_InfoMessage);
    Server server = new Server(new ServerConnection(conn));
    server.ConnectionContext.InfoMessage += new SqlInfoMessageEventHandler(ConnectionContext_InfoMessage);
    server.ConnectionContext.ExecuteNonQuery(script,ExecutionTypes.ContinueOnError);                
    MessageBox.Show("All Done");
}

イベント:-

public void conn_InfoMessage(object sender, SqlInfoMessageEventArgs e) {
    textBox3.Text += "1:"+DateTime.Now.ToString();
}

public void ConnectionContext_InfoMessage(object sender, SqlInfoMessageEventArgs e) {
    textBox3.Text += "2:" + DateTime.Now.ToString();
}
4

2 に答える 2

3

MSDNによると:

InfoMessageイベントは、重大度が10以下のメッセージがSQLServerから返されたときに発生します。重大度が11〜20のメッセージはエラーを発生させ、重大度が20を超えるメッセージは接続を閉じます。

すでに存在するテーブルのCreateTableのエラー重大度は16であり、InfoMessageイベントをバイパスします。

TSQLをTry...Catchブロックでラップし、RAISEERRORを使用することをお勧めします。TRY…CATCH構造は、データベース接続を終了しない、重大度が10を超えるすべての実行エラーをキャッチします。

または、テーブルの存在についてTSQLにチェックを追加し、InfoMessageイベントに発生するPrintを実行することもできます。

于 2009-09-28T13:02:09.383 に答える
1

私はプログラマー(DBA)ではないので、よくわかりません。次のカムが役立つと思います

conn.FireInfoMessageEventOnUserErrors = true;

于 2017-04-03T09:49:34.057 に答える