SqlException 类

定义

SQL Server 返回警告或错误时引发的异常。 此类不能被继承。

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";
    }
}

注解

每当.NET Framework数据提供程序 for SQL Server 遇到从服务器生成的错误时,都会创建此类。 (客户端错误作为标准公共语言运行时异常引发。) SqlException 始终至少包含一个 实例 SqlError

严重级别为 10 或更低的消息是信息性的,指示用户输入的信息错误导致的问题。 从 11 到 16 的严重性级别由用户生成,用户可以更正。 严重级别为 17 到 25 的消息指示存在软件或硬件错误。 发生级别 17、18 或 19 错误时,可以继续工作,但可能无法执行特定语句。

当严重级别为 19 或以下时,SqlConnection 将保持打开状态。 当严重性级别为 20 或更高时,服务器通常会关闭 SqlConnection。 但是,用户可以重新打开连接并继续操作。 最后两种情况下,执行该命令的方法将生成 SqlException

有关SQL Server发送的警告和信息性消息的信息,请参阅数据库引擎事件和错误。 类SqlException映射到SQL Server严重性。

下面是有关处理异常的一般信息。 代码应捕获异常,以防止应用程序崩溃,并允许向用户显示相关的错误消息。 可以使用数据库事务来确保无论客户端应用程序中发生什么情况,数据都是一致的, (包括崩溃) 。 System.Data.OleDbConnection、System.Data.ODBC.ODBCConnection 和 Microsoft.Data.SqlClient.SqlConnection 中的 System.Data.Transaction.TransactionScope 或 BeginTransaction 方法) (的功能可确保无论提供程序引发的异常如何,数据一致。 事务可能会失败,因此捕获失败并重试事务。

请注意,从 .NET Framework 4.5 开始,SqlException可以返回内部 Win32Exception

.NET Framework数据提供程序的异常类报告特定于提供程序的错误。 例如,System.Data.Odbc 具有 OdbcException,System.Data.OleDb 具有 OleDbException,Microsoft.Data.SqlClient 具有 SqlException。 为了获得最佳的错误详细信息级别,请捕获这些异常并使用这些异常类的成员来获取错误的详细信息。

除了特定于提供程序的错误,.NET Framework数据提供程序类型还可能引发.NET Framework异常,例如 System.OutOfMemoryException 和 System.Threading.ThreadAbortException。 可能无法从这些异常中恢复。

输入错误可能导致.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

获取从 SQL Server .NET Framework 数据提供程序返回的错误的严重级别。

ClientConnectionId

表示客户端连接 ID。 有关详细信息,请参阅 ADO.NET 中的数据跟踪

Errors

获取由一个或多个 SqlError 对象组成的集合,这些对象提供有关 SQL Server .NET Framework 数据提供程序所生成的异常的详细信息。

LineNumber

获取生成错误的 Transact-SQL 批命令或存储过程内的行号。

Number

获取一个标识错误类型的数字。

Procedure

获取生成错误的存储过程或远程过程调用 (RPC) 的名称。

Server

获取正在运行生成错误的 SQL Server 实例的计算机的名称。

Source

获取生成错误的提供程序的名称。

State

从 SQL Server 中获取一个数值错误代码,它表示错误、警告或“未找到数据”消息。 有关如何将这些值解码的更多信息,请参阅数据库引擎事件和错误

方法

GetObjectData(SerializationInfo, StreamingContext)
已过时.

使用关于异常的信息设置 SerializationInfo

ToString()

返回表示当前 SqlException 对象的字符串,并包括客户端连接 ID(有关更多信息,请参见 ClientConnectionId)。

适用于

另请参阅