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


DbConnection, DbCommand и DbException

После создания DbProviderFactory и DbConnectionвы можете работать с командами и средствами чтения данных для получения данных из источника данных.

Пример получения данных

В этом примере в качестве аргумента принимается объект DbConnection. Создается DbCommand для выбора данных из таблицы "Категории", задав CommandText инструкцию SQL SELECT. В коде предполагается, что таблица "Категории" существует в источнике данных. Подключение открыто, а данные извлекаются с помощью DbDataReader.

// Takes a DbConnection and creates a DbCommand to retrieve data
// from the Categories table by executing a DbDataReader.
static void DbCommandSelect(DbConnection connection)
{
    const string queryString =
        "SELECT CategoryID, CategoryName FROM Categories";

    // Check for valid DbConnection.
    if (connection != null)
    {
        using (connection)
        {
            try
            {
                // Create the command.
                DbCommand command = connection.CreateCommand();
                command.CommandText = queryString;
                command.CommandType = CommandType.Text;

                // Open the connection.
                connection.Open();

                // Retrieve the data.
                DbDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    Console.WriteLine($"{reader[0]}. {reader[1]}");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Exception.Message: {ex.Message}");
            }
        }
    }
    else
    {
        Console.WriteLine("Failed: DbConnection is null.");
    }
}
' Takes a DbConnection and creates a DbCommand to retrieve data
' from the Categories table by executing a DbDataReader. 
Private Shared Sub DbCommandSelect(ByVal connection As DbConnection)

    Dim queryString As String = _
       "SELECT CategoryID, CategoryName FROM Categories"

    ' Check for valid DbConnection.
    If Not connection Is Nothing Then
        Using connection
            Try
                ' Create the command.
                Dim command As DbCommand = connection.CreateCommand()
                command.CommandText = queryString
                command.CommandType = CommandType.Text

                ' Open the connection.
                connection.Open()

                ' Retrieve the data.
                Dim reader As DbDataReader = command.ExecuteReader()
                Do While reader.Read()
                    Console.WriteLine("{0}. {1}", reader(0), reader(1))
                Loop

            Catch ex As Exception
                Console.WriteLine("Exception.Message: {0}", ex.Message)
            End Try
        End Using
    Else
        Console.WriteLine("Failed: DbConnection is Nothing.")
    End If
End Sub

Выполнение примера команды

В этом примере в качестве аргумента принимается объект DbConnection. Если DbConnection действителен, то подключение открывается, а DbCommand создается и выполняется. Для объекта CommandText задан оператор SQL INSERT, который создает запись в таблице "Категории" в базе данных Northwind. В коде предполагается, что база данных Northwind существует в источнике данных, и что синтаксис SQL, используемый в инструкции INSERT, действителен для указанного поставщика. Ошибки, возникающие в источнике данных, обрабатываются блоком кода DbException, а все остальные исключения обрабатываются в блоке Exception.

// Takes a DbConnection, creates and executes a DbCommand.
// Assumes SQL INSERT syntax is supported by provider.
static void ExecuteDbCommand(DbConnection connection)
{
    // Check for valid DbConnection object.
    if (connection != null)
    {
        using (connection)
        {
            try
            {
                // Open the connection.
                connection.Open();

                // Create and execute the DbCommand.
                DbCommand command = connection.CreateCommand();
                command.CommandText =
                    "INSERT INTO Categories (CategoryName) VALUES ('Low Carb')";
                var rows = command.ExecuteNonQuery();

                // Display number of rows inserted.
                Console.WriteLine($"Inserted {rows} rows.");
            }
            // Handle data errors.
            catch (DbException exDb)
            {
                Console.WriteLine($"DbException.GetType: {exDb.GetType()}");
                Console.WriteLine($"DbException.Source: {exDb.Source}");
                Console.WriteLine($"DbException.ErrorCode: {exDb.ErrorCode}");
                Console.WriteLine($"DbException.Message: {exDb.Message}");
            }
            // Handle all other exceptions.
            catch (Exception ex)
            {
                Console.WriteLine($"Exception.Message: {ex.Message}");
            }
        }
    }
    else
    {
        Console.WriteLine("Failed: DbConnection is null.");
    }
}
' Takes a DbConnection and executes an INSERT statement.
' Assumes SQL INSERT syntax is supported by provider.
Private Shared Sub ExecuteDbCommand(ByVal connection As DbConnection)

    ' Check for valid DbConnection object.
    If Not connection Is Nothing Then
        Using connection
            Try
                ' Open the connection.
                connection.Open()

                ' Create and execute the DbCommand.
                Dim command As DbCommand = connection.CreateCommand()
                command.CommandText = _
                  "INSERT INTO Categories (CategoryName) VALUES ('Low Carb')"
                Dim rows As Integer = command.ExecuteNonQuery()

                ' Display number of rows inserted.
                Console.WriteLine("Inserted {0} rows.", rows)

                ' Handle data errors.
            Catch exDb As DbException
                Console.WriteLine("DbException.GetType: {0}", exDb.GetType())
                Console.WriteLine("DbException.Source: {0}", exDb.Source)
                Console.WriteLine("DbException.ErrorCode: {0}", exDb.ErrorCode)
                Console.WriteLine("DbException.Message: {0}", exDb.Message)

                ' Handle all other exceptions.
            Catch ex As Exception
                Console.WriteLine("Exception.Message: {0}", ex.Message)
            End Try
        End Using
    Else
        Console.WriteLine("Failed: DbConnection is Nothing.")
    End If
End Sub

Обработка ошибок данных с помощью DbException

Класс DbException является базовым классом для всех исключений, создаваемых от имени источника данных. Его можно использовать в коде обработки исключений для обработки исключений, создаваемых различными поставщиками, без ссылки на определенный класс исключений. В следующем фрагменте кода показано, как использовать DbException для отображения сведений об ошибках, возвращаемых источником данных с помощью GetType, Source, ErrorCodeи свойств Message. Выходные данные будут отображать тип ошибки, источник, указывающий имя поставщика, код ошибки и сообщение, связанное с ошибкой.

Try  
    ' Do work here.  
Catch ex As DbException  
    ' Display information about the exception.  
    Console.WriteLine("GetType: {0}", ex.GetType())  
    Console.WriteLine("Source: {0}", ex.Source)  
    Console.WriteLine("ErrorCode: {0}", ex.ErrorCode)  
    Console.WriteLine("Message: {0}", ex.Message)  
Finally  
    ' Perform cleanup here.  
End Try  
try  
{  
    // Do work here.  
}  
catch (DbException ex)  
{  
    // Display information about the exception.  
    Console.WriteLine("GetType: {0}", ex.GetType());  
    Console.WriteLine("Source: {0}", ex.Source);  
    Console.WriteLine("ErrorCode: {0}", ex.ErrorCode);  
    Console.WriteLine("Message: {0}", ex.Message);  
}  
finally  
{  
    // Perform cleanup here.  
}  

См. также