Подключение приложения ASP.NET к Базе данных SQL Azure

Завершено

Подключать приложение к базам данных в службе "База данных SQL Azure" можно различными способами. Для приложений .NET можно использовать библиотеку System.Data.SqlClient.

Университетское веб-приложение должно извлекать и отображать данные, переданные в базу данных SQL. В этом уроке вы узнаете, как подключиться к базе данных из веб-приложения и использовать библиотеку System.Data.SqlClient для обработки данных.

Общие сведения о библиотеке System.Data.SqlClient

Библиотека System.Data.SqlClient представляет собой набор типов и методов, которые можно использовать для подключения к базе данных SQL Server, размещенной в локальной среде или в облаке в Базе данных SQL. Она предоставляет универсальный интерфейс для получения данных и их обработки. Вы можете использовать библиотеку System.Data.SqlClient для выполнения команд Transact-SQL (T-SQL) и транзакционных операций и получения данных. Операции можно параметризовать, чтобы избежать проблем, связанных с атаками путем внедрения кода SQL. В случае сбоя операции библиотека System.Data.SqlClient предоставляет сведения об ошибке посредством специальных классов исключений и ошибок. Такие исключения можно обрабатывать так же, как любые другие в приложении .NET.

Библиотека System.Data.SqlClient доступна в составе пакета NuGet System.Data.SqlClient.

Подключение к отдельной базе данных

Подключение к базе данных создается с помощью объекта SqlConnection. Необходимо предоставить строку подключения, в которой указываются имя и расположение базы данных, учетные данные и другие параметры подключения. Типичная строка подключения к одной базе данных выглядит так:

Server=tcp:myserver.database.windows.net,1433;Initial Catalog=mydatabase;Persist Security Info=False;User ID=myusername;Password=mypassword;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;

Строку подключения для отдельной базы данных можно найти на портале Azure на странице Строки подключения для базы данных.

В следующем примере кода показано создание объекта SqlConnection:

using System.Data.SqlClient;

...

string connectionString = "Server=tcp:myserver.database.windows.net,...";
SqlConnection con = new SqlConnection(connectionString);

Чтобы установить подключение к базе данных, его нужно открыть. Обычно подключение открывается непосредственно перед выполнением команды или запроса T-SQL.

con.Open();

Некоторые базы данных поддерживают ограниченное количество одновременных подключений. Таким образом, после завершения команды и получения результатов рекомендуется закрыть подключение и высвободить удерживаемые ресурсы.

con.Close();

Еще один распространенный подход — создание подключения в операторе using. При этом подключение закрывается автоматически, когда выполнение оператора using завершается. Можно также явно вызвать метод Close.

using (SqlConnection con = new SqlConnection(connectionString))
{
    // Open and Use the connection here
    con.Open();
    ...
}
// Connection is now closed

Определение команды или запроса T-SQL

SqlCommand Создайте объект для указания команды или запроса T-SQL для выполнения. В следующем примере показана инструкция T-SQL DELETE , которая удаляет строки для заданного клиента из dbo.Orders таблицы. Команды можно параметризовать. В этом примере используется параметр, который называется CustID для CustomerID значения. Строка, которая задает CommandType свойство SqlCommand объекта, Text указывающее, что команда является инструкцией T-SQL. Вы также можете запустить хранимую процедуру, а не инструкцию T-SQL. В этом случае свойству CommandType следует присвоить значение StoredProcedure.

SqlCommand deleteOrdersForCustomer = new SqlCommand("DELETE FROM Orders WHERE CustomerID = @custID", con);
deleteOrdersForCustomer.CommandType = CommandType.Text;
string customerID = <prompt the user for a customer to delete>;
deleteOrdersForCustomer.Parameters.Add(new SqlParameter("custID", customerID));

Последний параметр конструктора SqlCommand, показанного в примере, — это подключение, которое будет использоваться для выполнения команды.

В следующем примере показан запрос, который объединяет таблицы и dbo.Orders таблицы dbo.Customers для создания списка имен клиентов и их заказов.

SqlCommand queryCmd = new SqlCommand(
                    @"SELECT c.FirstName, c.LastName, o.OrderID
                      FROM Customers c JOIN Orders o
                      ON c.CustomerID = o.CustomerID", con);
queryCmd.CommandType = CommandType.Text;

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

SqlCommand Если объект ссылается на инструкцию T-SQL, которая не возвращает результирующий набор, выполните команду с помощью ExecuteNonQuery метода. Если команда выполнена успешно, она возвращает количество строк, затронутых операцией. В следующем примере показано, как выполнить команду, показанную deleteOrdersForCustomer ранее.

int numDeleted = deleteOrdersForCustomer.ExecuteNonQuery();

Если выполнение команды должно занять некоторое время, можно воспользоваться методом ExecuteNonQueryAsync для выполнения операции в асинхронном режиме.

Выполнение запроса и получение данных

Если вы SqlCommand содержите инструкцию T-SQL SELECT, запустите ее с помощью ExecuteReader метода. Этот метод возвращает объект SqlDataReader, с помощью которого можно выполнить перебор результатов и обработать каждую строку по очереди. Данные из объекта SqlReader извлекаются с помощью метода Read. Он возвращает значение true, если строка найдена, или false, если больше нет строк для считывания. После считывания строки ее данные доступны в полях объекта SqlReader. Эти поля имеют те же имена, что и соответствующие столбцы в исходной инструкции SELECT. Однако данные для каждого поля извлекаются в виде нетипизированного объекта object, поэтому перед использованием их нужно преобразовать в подходящий тип. В следующем коде показано, как выполнить queryCmd команду, которую мы проиллюстрировали ранее, чтобы получить данные по одной строке за раз.

SqlDataReader rdr = queryCmd.ExecuteReader();

// Read the data a row at a time
while (rdr.Read())
{
    string firstName = rdr["FirstName"].ToString();
    string lastName = rdr["LastName"].ToString();
    int orderID = Convert.ToInt32(rdr["OrderID"]);

    // Process the data
    ...
}

Обработка ошибок и исключений

Исключения и ошибки могут происходить при работе с базой данных по самым разным причинам. Например, таблица, к которой производится доступ, может быть удалена. Ошибки T-SQL можно поймать с помощью SqlException типа.

Различные события или проблемы в базе данных могут вызвать исключение. У объекта SqlException есть свойство Errors, которое содержит коллекцию объектов SqlError. Каждый из этих объектов предоставляет сведения об одной ошибке. В приведенном ниже примере показано, как перехватить исключение SqlException и обработать содержащиеся в нем ошибки.

...
using (SqlConnection con = new SqlConnection(connectionString))
{
    SqlCommand command = new SqlCommand("DELETE FROM ...", con);
    try
    {
        con.Open();
        command.ExecuteNonQuery();
    }
    catch (SqlException ex)
    {
        for (int i = 0; i < ex.Errors.Count; i++)
        {
            Console.WriteLine($"Index # {i} Error: {ex.Errors[i].ToString()}");
        }
    }
}