Připojení aplikace ASP.NET k Azure SQL Database
K databázím, které jsou ve službě Azure SQL Database, se dá z aplikace připojit různými způsoby. V případě aplikací .NET můžete použít knihovnu System.Data.SqlClient
.
Webová aplikace univerzity musí načítat a zobrazovat data, která jste nahráli do databáze SQL. V této lekci se dozvíte, jak se připojit k databázi z webové aplikace a používat knihovnu System.Data.SqlClient
ke zpracování dat.
Základní informace o knihovně System.Data.SqlClient
Knihovna System.Data.SqlClient
představuje kolekci typů a metod, které můžete použít k připojení k databázi SQL Serveru. Tato databáze běží v místním počítači nebo v cloudu v SQL Database. Knihovna nabízí obecné rozhraní k načítání a údržbě dat. Pomocí knihovny můžete spouštět příkazy jazyka System.Data.SqlClient
Transact-SQL (T-SQL) a transakční operace a načítat data. Tyto operace můžete parametrizovat, abyste se vyhnuli potížím, které jsou spojené s útoky prostřednictvím injektáže SQL. Při neúspěšné operaci knihovna System.Data.SqlClient
poskytne informace o chybě prostřednictvím zvláštních tříd výjimek a chyb. S těmito výjimkami se pracuje stejně jako s jinými typy výjimek v aplikaci .NET.
Knihovna System.Data.SqlClient
je k dispozici v balíčku NuGet System.Data.SqlClient.
Připojení k jednoúčelové databázi
K vytvoření připojení k databázi použijete objekt SqlConnection
. Zadejte připojovací řetězec, který určuje název a umístění databáze, používané přihlašovací údaje a další parametry týkající se připojení. Typický připojovací řetězec k jednoúčelové databázi vypadá takto:
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;
Připojovací řetězec ke své jednoúčelové databázi najdete na webu Azure Portal na stránce Připojovací řetězce u své databáze.
V následujícím příkladu kódu je vidět, jak vytvořit objekt SqlConnection
:
using System.Data.SqlClient;
...
string connectionString = "Server=tcp:myserver.database.windows.net,...";
SqlConnection con = new SqlConnection(connectionString);
Databázové připojení není navázané, dokud ho neotevřete. Připojení obvykle otevřete bezprostředně před spuštěním příkazu nebo dotazu T-SQL.
con.Open();
Některé databáze podporují jen omezený počet souběžných připojení. Po dokončení běhu příkazu a načtení všech výsledků je proto vhodné připojení uzavřít a uvolnit všechny prostředky, které byly použity.
con.Close();
Další často používanou možností je vytvořit připojení příkazem using
. Při této strategii se připojení po dokončení příkazu using
automaticky ukončí. Můžete ale také explicitně zavolat metodu Close
.
using (SqlConnection con = new SqlConnection(connectionString))
{
// Open and Use the connection here
con.Open();
...
}
// Connection is now closed
Definování příkazu nebo dotazu T-SQL
Vytvořte SqlCommand
objekt pro zadání příkazu T-SQL nebo dotazu, který se má spustit. Následující příklad ukazuje příkaz T-SQL DELETE
, který odebere řádky pro daného zákazníka z dbo.Orders
tabulky. Příkazy můžete parametrizovat. V tomto příkladu se pro hodnotu používá parametr s názvem CustIDCustomerID
. Řádek, který nastaví CommandType
vlastnost SqlCommand
objektu Text
označuje, že příkaz je příkaz T-SQL. Uloženou proceduru můžete také spustit místo příkazu T-SQL. V takovém případě nastavte CommandType
na 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));
Posledním parametrem konstruktoru SqlCommand
v tomto příkladu je připojení, které se použije ke spuštění příkazu.
Následující příklad ukazuje dotaz, který spojí dbo.Customers
tabulky a dbo.Orders
vytvoří seznam jmen zákazníků a jejich objednávek.
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;
Spuštění příkazu
Pokud objekt SqlCommand
odkazuje na příkaz T-SQL, který nevrací sadu výsledků, spusťte příkaz pomocí ExecuteNonQuery
metody. Pokud je příkaz úspěšný, vrátí počet řádků ovlivněných operací. Další příklad ukazuje, jak spustit deleteOrdersForCustomer
příkaz, který byl zobrazen dříve.
int numDeleted = deleteOrdersForCustomer.ExecuteNonQuery();
Pokud předpokládáte, že běh příkazu chvíli potrvá, můžete použít metodu ExecuteNonQueryAsync
a provést operaci asynchronně.
Spuštění dotazu a načtení dat
SqlCommand
Pokud obsahuje příkaz T-SQL SELECT, spustíte ho ExecuteReader
pomocí metody. Tato metoda vrátí objekt SqlDataReader
, který můžete použít k iteraci výsledků a postupnému zpracování každého řádku. K načtení dat z objektu SqlReader
použijte metodu Read
. Tato metoda vrátí hodnotu true, pokud najde řádek, nebo hodnotu false, pokud nenajde další řádky ke čtení. Po přečtení řádku budou jeho data k dispozici v polích objektu SqlReader
. Každé pole má stejný název jako odpovídající sloupec původního příkazu SELECT. Do každého pole se data načtou jako object
bez typu, takže je před použitím musíte převést na příslušný typ. Následující kód ukazuje, jak spustit queryCmd
příkaz, který jsme si ukázali dříve, aby se data načítá po jednom řádku.
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
...
}
Ošetření výjimek a chyb
Při používání databáze může z různých důvodů docházet k výjimkám a chybám. Můžete se třeba pokoušet získat přístup k tabulce, která už neexistuje. Chyby T-SQL můžete zachytit pomocí typu SqlException
.
Výjimky můžou aktivovat různé události nebo problémy v databázi. Objekt SqlException
má vlastnost Errors
, která obsahuje kolekci objektů SqlError
. V těchto objektech jsou podrobnosti o každé chybě. Následující příklad ukazuje, jak zachytit objekt SqlException
a zpracovat chyby, které obsahuje.
...
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()}");
}
}
}