次の方法で共有


SqlException クラス

定義

この例外は、SQL サーバーから警告またはエラーが返された場合にスローされます。 このクラスは継承できません。

public ref class SqlException sealed : System::Data::Common::DbException
[System.Serializable]
public sealed class SqlException : System.Data.Common.DbException
public sealed class SqlException : System.Data.Common.DbException
[<System.Serializable>]
type SqlException = class
    inherit DbException
type SqlException = class
    inherit DbException
Public NotInheritable Class SqlException
Inherits DbException
継承
SqlException
属性

次の例では、 を SqlException 生成し、例外を表示します。

using Microsoft.Data.SqlClient;
using System.Text;

class Program
{
    static void Main()
    {
        string s = GetConnectionString();
        ShowSqlException(s);
        Console.ReadLine();
    }
    public static void ShowSqlException(string connectionString)
    {
        string queryString = "EXECUTE NonExistantStoredProcedure";
        StringBuilder errorMessages = new StringBuilder();

        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            SqlCommand command = new SqlCommand(queryString, connection);
            try
            {
                command.Connection.Open();
                command.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                for (int i = 0; i < ex.Errors.Count; i++)
                {
                    errorMessages.Append("Index #" + i + "\n" +
                        "Message: " + ex.Errors[i].Message + "\n" +
                        "LineNumber: " + ex.Errors[i].LineNumber + "\n" +
                        "Source: " + ex.Errors[i].Source + "\n" +
                        "Procedure: " + ex.Errors[i].Procedure + "\n");
                }
                Console.WriteLine(errorMessages.ToString());
            }
        }
    }

    static private string GetConnectionString()
    {
        // To avoid storing the connection string in your code, 
        // you can retrieve it from a configuration file.
        return "Data Source=(local);Initial Catalog=AdventureWorks;"
            + "Integrated Security=SSPI";
    }
}

注釈

このクラスは、SQL Serverの.NET Framework データ プロバイダーがサーバーから生成されたエラーを検出するたびに作成されます。 (クライアント側のエラーは、標準の共通言語ランタイム例外としてスローされます)。 SqlException には、常に 少なくとも 1 つの インスタンスが SqlError含まれます。

重大度レベルが 10 以下のメッセージは情報であり、ユーザーが入力した情報の誤りによって発生した問題を示します。 11 から 16 までの重大度レベルはユーザーによって生成され、ユーザーが修正できます。 重大度レベルが 17 ~ 25 のエラーは、ソフトウェアまたはハードウェアのエラーです。 レベル 17、18、または 19 のエラーが発生した場合は、特定のステートメントを実行できない可能性がありますが、作業を続行できます。

重大度レベルが 19 以下の場合、SqlConnection は開いたままです。 重大度レベルが 20 以上の場合、通常、サーバーは を SqlConnection閉じます。 ただし、ユーザーは接続を再び開き、続行できます。 どちらの場合も、コマンドを実行しているメソッドによって SqlException が生成されます。

SQL Serverによって送信される警告メッセージと情報メッセージの詳細については、「データベース エンジンのイベントとエラー」を参照してください。 クラスはSqlException、重大度SQL Serverにマップされます。

例外の処理に関する一般的な情報を次に示します。 アプリケーションがクラッシュするのを防ぎ、関連するエラー メッセージをユーザーに表示できるようにするために、コードで例外をキャッチする必要があります。 データベース トランザクションを使用すると、クライアント アプリケーションで何が起こるかに関係なく (クラッシュを含む) データの整合性を確保できます。 System.Transaction.TransactionScope や BeginTransaction メソッド (System.Data.OleDb.OleDbConnection、System.Data.ODBC.ODBCConnection、Microsoft.Data.SqlClient.SqlConnection) などの機能により、プロバイダーによって発生する例外に関係なく、一貫性のあるデータが確保されます。 トランザクションは失敗する可能性があるため、失敗をキャッチしてトランザクションを再試行してください。

.NET Framework 4.5 以降では、SqlException内部 を返すことができることに注意してくださいWin32Exception

.NET Framework データ プロバイダーの例外クラスは、プロバイダー固有のエラーを報告します。 たとえば、System.Data.Odbc には OdbcException、System.Data.OleDb には OleDbException、Microsoft.Data.SqlClient には SqlException があります。 エラーの詳細の最適なレベルについては、これらの例外をキャッチし、これらの例外クラスのメンバーを使用してエラーの詳細を取得します。

プロバイダー固有のエラーに加えて、.NET Frameworkデータ プロバイダーの種類では、System.OutOfMemoryException や System.Threading.ThreadAbortException などの.NET Framework例外が発生する可能性があります。 これらの例外から復旧できない場合があります。

入力が正しくないと、.NET Frameworkデータ プロバイダーの種類で System.ArgumentException や System.IndexOutOfRangeException などの例外が発生する可能性があります。 メソッドを間違ったタイミングで呼び出すと、System.InvalidOperationException が発生する可能性があります。

そのため、一般に、プロバイダー固有の例外と共通言語ランタイムからの例外をキャッチする例外ハンドラーを記述します。 これらは、次のように階層化できます。

try {  
   // code here  
}  
catch (SqlException odbcEx) {  
   // Handle more specific SqlException exception here.  
}  
catch (Exception ex) {  
   // Handle generic ones here.  
}  

または:

try {  
   // code here  
}  
catch (Exception ex) {  
   if (ex is SqlException) {  
      // Handle more specific SqlException exception here.  
   }  
   else {  
      // Handle generic ones here.  
   }  
}  

また、.NET Framework データ プロバイダー メソッドの呼び出しが、スタック上のユーザー コードのないスレッド プール スレッドで失敗する可能性もあります。 この場合、および 非同期メソッド呼び出しを使用する場合は、これらの例外を処理し、アプリケーションのクラッシュを UnhandledException 回避するために イベントを登録する必要があります。

プロパティ

BatchCommand

エラーを生成した BatchCommand インスタンスを取得します。例外がバッチから発生しなかった場合は null を取得します。

Class

.NET Framework SQL Server 用データ プロバイダーが返したエラーの重大度レベルを取得します。

ClientConnectionId

クライアント接続 ID を表します 。 詳細については、「ADO.NET のデータ追跡」を参照してください。

Errors

.NET Framework SQL Server 用データ プロバイダーが生成する例外の詳細情報を提供する、1 つ以上の SqlError オブジェクトのコレクションを取得します。

LineNumber

Transact-SQL コマンドのバッチまたはストアド プロシージャ内の、エラーを生成した行の番号を取得します。

Number

エラーの種類を示す番号を取得します。

Procedure

エラーを生成したストアド プロシージャまたはリモート プロシージャ コール (RPC) の名前を取得します。

Server

エラーを生成した SQL Server インスタンスを実行しているコンピューターの名前を取得します。

Source

エラーを生成したプロバイダーの名前を取得します。

State

エラー、警告、または "データがありません" というメッセージを表す、数字によるエラー コードを SQL Server から取得します。 これらの値のデコード方法について詳しくは、データベース エンジンのイベントとエラーに関するページをご覧ください。

メソッド

GetObjectData(SerializationInfo, StreamingContext)
古い.

例外に関する情報を含む SerializationInfo を設定します。

ToString()

現在の SqlException オブジェクトを表し、クライアント接続 ID を含む文字列を返します (詳細については、 ClientConnectionId を参照してください)。

適用対象

こちらもご覧ください