Připojení aplikace ASP.NET k Azure SQL Database

Dokončeno

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()}");
        }
    }
}