Ansluta ett ASP.NET-program till Azure SQL Database

Slutförd

Du kan ansluta till databaser i Azure SQL Database-tjänsten från ett program på flera olika sätt. I .NET-program kan du använda System.Data.SqlClient-biblioteket.

Universitetets webbapp måste kunna hämta och visa de data som du laddade upp till SQL-databasen. I den här lektionen System.Data.SqlClient får du lära dig hur du ansluter till en databas från en webbapp och använder biblioteket för att bearbeta data.

Översikt över biblioteket System.Data.SqlClient

System.Data.SqlClient-biblioteket är en samling av typer och metoder som du kan använda för att ansluta till en SQL Server-databas, som antingen körs lokalt eller i molnet på SQL Database. Biblioteket innehåller ett allmänt gränssnitt för hämtning och underhåll av data. Du kan använda System.Data.SqlClient biblioteket för att köra Transact-SQL-kommandon (T-SQL) och transaktionsåtgärder och för att hämta data. Du kan parameterisera dessa åtgärder för att undvika problem med SQL-inmatningsattacker. Om en åtgärd misslyckas visar System.Data.SqlClient-biblioteket felinformation via speciella klasser för undantag och fel. Du hanterar de här undantagen på samma sätt som alla andra typer av undantag i ett .NET-program.

System.Data.SqlClient-biblioteket finns i NuGet-paketet System.Data.SqlClient.

Ansluta till en enkel databas

Du skapar en databasanslutning med hjälp av ett SqlConnection-objekt. Ange en anslutningssträng med namnet och platsen för databasen, autentiseringsuppgifterna som ska användas och andra anslutningsrelaterade parametrar. En typisk anslutningssträng till en enkel databas ser ut så här:

Server=tcp:<server-name>.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;

Du hittar anslutningssträngen till din enkla databas på sidan Anslutningssträngar för din databas i Azure-portalen.

I följande kodexempel visas hur du skapar ett SqlConnection-objekt:

using System.Data.SqlClient;

...

string connectionString = "Server=tcp:<server-name>.database.windows.net,...";
SqlConnection con = new SqlConnection(connectionString);

Databasanslutningen är inte upprättad förrän du öppnar anslutningen. Du öppnar vanligtvis anslutningen omedelbart innan du kör ett T-SQL-kommando eller en fråga.

con.Open();

Vissa databaser har endast stöd för ett ändligt antal samtidiga anslutningar. Så när du har kört ett kommando och hämtat alla resultat, kan det vara bra att stänga anslutningen och frigöra eventuella resurser som har använts.

con.Close();

En annan vanlig metod är att skapa anslutningen i en using-instruktion. Den här strategin stänger automatiskt anslutningen när using-instruktionen har slutförts. Men du kan också uttryckligen anropa Close-metoden.

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

Definiera ett T-SQL-kommando eller en fråga

Skapa ett SqlCommand objekt för att ange ett T-SQL-kommando eller en fråga som ska köras. I följande exempel visas en T-SQL-instruktion DELETE som tar bort rader för en viss kund från dbo.Orders tabellen. Du kan parameterisera kommandon. I det här exemplet används en parameter med namnet CustID för CustomerID värdet. Raden som anger CommandType egenskapen SqlCommand för objektet till Text anger att kommandot är en T-SQL-instruktion. Du kan också köra en lagrad procedur i stället för en T-SQL-instruktion. Ange då CommandType till 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));

Den sista parametern i SqlCommand-konstruktorn som visas i det här exemplet är den anslutning som ska användas för att köra kommandot.

I nästa exempel visas en fråga som sammanfogar tabellerna dbo.Customers och dbo.Orders för att skapa en lista med kundnamn och deras beställningar.

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;

Köra ett kommando

Om objektet SqlCommand refererar till en T-SQL-instruktion som inte returnerar en resultatuppsättning kör du kommandot med hjälp ExecuteNonQuery av metoden . Om kommandot lyckas returneras antalet rader som påverkas av åtgärden. I nästa exempel visas hur du kör deleteOrdersForCustomer kommandot som visades tidigare.

int numDeleted = deleteOrdersForCustomer.ExecuteNonQuery();

Om du tror att det kommer att ta tid att köra kommandot kan du använda ExecuteNonQueryAsync- metoden till att utföra åtgärden asynkront.

Köra en fråga och hämta data

Om din SqlCommand innehåller en T-SQL SELECT-instruktion kör du den med hjälp ExecuteReader av metoden . Den här metoden returnerar ett SqlDataReader-objekt som du kan iterera via resultaten och bearbeta varje rad i tur och ordning. Du hämtar dina data från ett SqlReader-objekt med Read-metoden. Den här metoden returnerar TRUE om en rad hittas och FALSE när det inte finns några fler rader kvar att läsa. När en rad har lästs finns dina data för den raden tillgängliga i fälten i SqlReader-objektet. Varje fält har samma namn som motsvarande kolumn i den ursprungliga SELECT-instruktionen. Data i varje fält hämtas dock som ett object utan angiven typ, så du måste konvertera den till lämplig typ innan du kan använda den. Följande kod visar hur du kör queryCmd kommandot som vi illustrerade tidigare för att hämta data en rad i taget.

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
    ...
}

Hantera undantag och fel

Undantag och fel kan inträffa av olika anledningar när du använder en databas. Exempelvis kan du försöka att få åtkomst till en tabell som inte längre finns. Du kan fånga upp T-SQL-fel med hjälp av typen SqlException .

Olika händelser eller problem i databasen kan utlösa ett undantag. Ett SqlException-objekt har en Errors-egenskap som innehåller en samling SqlError-objekt. De här objekten visar information om varje fel. Följande exempel visar hur du hittar ett SqlException och bearbetar de fel som det innehåller.

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