Поделиться через


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 для SQL Server обнаруживает ошибку, созданную на сервере. (Ошибки на стороне клиента создаются как стандартные исключения среды CLR.) SqlException всегда содержит по крайней SqlErrorмере один экземпляр .

Сообщения с уровнем серьезности 10 или менее являются информационными и указывают на проблемы, вызванные ошибками в данных, введенных пользователем. Уровни серьезности от 11 до 16 создаются пользователем и могут быть исправлены пользователем. Уровни важности с 17 по 25 указывают на ошибки программного обеспечения или оборудования. При возникновении ошибки уровня 17, 18 или 19 можно продолжить работу, хотя выполнение определенной инструкции может быть невозможно.

SqlConnection остается открытым, если уровень важности не превышает 19. Если уровень серьезности равен 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 типы поставщиков данных могут вызывать платформа .NET Framework исключения, такие как System.OutOfMemoryException и System.Threading.ThreadAbortException. Восстановление из этих исключений может оказаться невозможным.

Неправильные входные данные могут вызвать исключение типа поставщика данных платформа .NET Framework, например System.ArgumentException или System.IndexOutOfRangeException. Вызов метода в неправильное время может вызвать исключение System.InvalidOperationException.

Поэтому, как правило, напишите обработчик исключений, который перехватывает исключения, относящиеся к поставщику, а также исключения из среды CLR. Они могут быть наложены следующим образом:

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

Представляет идентификатор клиентского соединения. Дополнительные сведения см. в разделе Трассировка данных в ADO.NET.

Errors

Получает коллекцию из одного или нескольких объектов SqlError, которые предоставляют детальные сведения об исключениях, создаваемых поставщиком данных платформой .NET Framework для SQL Server.

LineNumber

Возвращает номер вызвавшей ошибку строки пакета команд Transact-SQL или хранимой процедуры.

Number

Возвращает число, определяющее тип ошибки.

Procedure

Возвращает имя вызвавшей ошибку хранимой процедуры или удаленного вызова процедур (RPC).

Server

Возвращает имя компьютера, на котором выполняется вызвавший ошибку экземпляр SQL Server.

Source

Возвращает имя вызвавшего ошибку поставщика.

State

Получает от SQL Server числовой код ошибки, предоставляющий ошибку, предупреждение или сообщение о том, что данные не обнаружены. Дополнительные сведения о расшифровке этих значений см. в статье События и ошибки ядра СУБД.

Методы

GetObjectData(SerializationInfo, StreamingContext)
Устаревшие..

Заполняет объект SerializationInfo сведениями об исключении.

ToString()

Возвращает строку, представляющую текущий объект SqlException и содержащую идентификатор клиентского соединения (дополнительные сведения см. в разделе ClientConnectionId).

Применяется к

См. также раздел