Подключение приложения 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()}");
}
}
}