Ansluta ett ASP.NET-program till Azure SQL Database
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()}");
}
}
}