14

重複の可能性:
SQLException の原因となった Query/CommandText を取得する

エラー処理コード (elmah を使用) に取り組んでいますが、デフォルトのセットアップではエラー メッセージのみが送信されます。エラーをスローする実際の SQL を知りたい (つまり、"SELECT * FROM thisTableDoesNotExist")

これは私がこれまでに持っているものです:

if (e.Error.Exception is SqlException)
{
    //if SQL exception try to give some extra information
    SqlException sqlEx = e.Error.Exception as SqlException;
    e.Mail.Body = e.Mail.Body + "<div>" +
                                "<h1>SQL EXCEPTION</h1>" +
                                "<b>Message</b>: " + sqlEx.Message +
                                "<br/><b>LineNumber:</b> " + sqlEx.LineNumber + 
                                "<br/><b>Source:</b> " + sqlEx.Source +
                                "<br/><b>Procedure:</b> " + sqlEx.Procedure +
                                "</div>";
}

また、実際の SQL も表示できるようにしたいと考えています。データベースは SQL Server 2008 であり、 SqlException の型はSystem.Data.SqlClient.SqlExceptionです。

4

4 に答える 4

7

ありえない。SQL コマンドが実行された例外をキャッチし、独自のカスタム例外にコマンド テキストを含める必要があります。SQLException の原因となった Query/CommandText の取得を参照してください。

于 2011-01-28T22:42:14.083 に答える
1

SQL にエラー処理コードを含めることができます。エラーが発生した場合は、実行しようとした SQL を print または return ステートメントで送り返すか、アプリケーションに返したい方法で返すことができます。

于 2011-01-28T22:45:48.890 に答える
1

例外を調べる最善の方法は、コード内に例外が発生した場所にブレークポイントを置き、例外オブジェクト グラフの値を調べることです。

次のように、 InnerExceptionの Message メンバーを試してください。

sqlEx.InnerException.Message

失敗した正確な SQL は提供されない場合がありますが、操作やテーブル名などのより具体的な情報が提供される場合があります。StackTrace メンバーにもいくつかの情報がある場合があります。

于 2011-01-28T22:40:46.643 に答える
0

C# 側で十分な情報を取得できない場合は、"SQL プロファイラー" (完全な MS SQL の一部) を使用して、実行されたコマンドを確認できます。

SQL プロファイラーに関する情報 http://msdn.microsoft.com/en-us/library/ms181091.aspx。プロファイラーがない場合は、基礎となるトレース API も使用できるはずです - http://msdn.microsoft.com/en-us/library/ms191006.aspx

于 2011-01-28T22:51:40.053 に答える