Egy ASP.NET-alkalmazás csatlakoztatása az Azure SQL Database-hez
Az Azure SQL Database szolgáltatáson belüli adatbázisokhoz többféleképpen lehet csatlakozni az alkalmazásokból. A .NET-alkalmazások esetében használhatja a System.Data.SqlClient
kódtárat.
Az egyetem webalkalmazásának be kell tudni olvasnia és meg kell tudnia jelenítenie az SQL-adatbázisba feltöltött adatokat. Ebben a leckében megtudhatja, hogyan csatlakozhat egy adatbázishoz egy webalkalmazásból, és hogyan használhatja a kódtárat az System.Data.SqlClient
adatok feldolgozására.
A System.Data.SqlClient kódtár áttekintése
A System.Data.SqlClient
kódtár olyan típusok és metódusok gyűjteménye, amelyekkel helyszíni vagy a felhőben, az SQL Database-en futó SQL Server-adatbázisokhoz csatlakozhat. A kódtár egy általános felületet biztosít az adatok lekéréséhez és karbantartásához. A System.Data.SqlClient
kódtár használatával Transact-SQL -parancsokat és tranzakciós műveleteket futtathat, valamint adatokat kérdezhet le. Ezeket a műveleteket az SQL-injektálási támadásokkal kapcsolatos problémák elkerülése érdekében paraméterezni lehet. Ha egy művelet meghiúsul, a System.Data.SqlClient
kódtár hibaadatokat nyújt a speciális kivétel- és hibaosztályokon keresztül. Ezeket a kivételeket ugyanúgy kell kezelni, mint a .NET-alkalmazások más típusú kivételeit.
A System.Data.SqlClient
kódtár a System.Data.SqlClient NuGet-csomagban érhető el.
Önálló adatbázishoz való csatlakozás
Az adatbázis-kapcsolatokat egy SqlConnection
objektummal lehet létrehozni. Meg kell adnia egy kapcsolati sztringet, amely megadja az adatbázis nevét és helyét, a hitelesítő adatokat és a többi kapcsolatra vonatkozó paramétereket. Az önálló adatbázisok tipikus kapcsolati sztringje így néz ki:
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;
Az önálló adatbázishoz tartozó kapcsolati sztringet az adatbázis Kapcsolati sztringek oldalán találja az Azure Portalon.
Az alábbi példakód bemutatja, hogyan lehet létrehozni az SqlConnection
objektumot:
using System.Data.SqlClient;
...
string connectionString = "Server=tcp:myserver.database.windows.net,...";
SqlConnection con = new SqlConnection(connectionString);
Az adatbázis-kapcsolat nem jön létre, amíg meg nem nyitja a kapcsolatot. A kapcsolatot általában közvetlenül a T-SQL-parancs vagy lekérdezés futtatása előtt nyitja meg.
con.Open();
Egyes adatbázisok csak véges számú konkurens kapcsolatot támogatnak. Ezért a parancsok futtatása és az eredmények lekérése után ajánlott lezárni a kapcsolatot, és felszabadítani a lefoglalt erőforrásokat.
con.Close();
Egy másik gyakran használt módszer a kapcsolat using
utasítással való létrehozása. Ez a stratégia automatikusan lezárja a kapcsolatot a using
utasítás befejeződésekor. A Close
metódus explicit módon is meghívható.
using (SqlConnection con = new SqlConnection(connectionString))
{
// Open and Use the connection here
con.Open();
...
}
// Connection is now closed
T-SQL-parancs vagy lekérdezés definiálása
Hozzon létre egy objektumot SqlCommand
egy futtatandó T-SQL-parancs vagy lekérdezés megadásához. Az alábbi példa egy T-SQL-utasítást DELETE
mutat be, amely eltávolítja egy adott ügyfél sorait a dbo.Orders
táblából. A parancsok paraméterezhetők. Ez a példa egy CustID nevű paramétert használ az CustomerID
értékhez. Az objektum Text
tulajdonságát SqlCommand
meghatározó CommandType
sor azt jelzi, hogy a parancs egy T-SQL utasítás. T-SQL utasítás helyett tárolt eljárást is futtathat. Ez esetben a CommandType
tulajdonságot StoredProcedure
értékre kell beállítani.
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));
A példában látható SqlCommand
konstruktor utolsó paramétere a parancs futtatásához használt kapcsolat.
A következő példa egy olyan lekérdezést mutat be, amely összekapcsolja a táblákat és dbo.Orders
a dbo.Customers
vevők nevét és rendeléseit.
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;
Parancs futtatása
Ha az SqlCommand
objektum egy olyan T-SQL-utasításra hivatkozik, amely nem ad eredményhalmazt, futtassa a parancsot a ExecuteNonQuery
metódussal. Ha a parancs sikeres, a művelet által érintett sorok számát adja vissza. A következő példa bemutatja, hogyan futtathatja a deleteOrdersForCustomer
korábban bemutatott parancsot.
int numDeleted = deleteOrdersForCustomer.ExecuteNonQuery();
Ha arra számít, hogy a parancs futtatása sok időt fog igénybe venni, a művelet aszinkron módon is elvégezhető az ExecuteNonQueryAsync
metódussal.
Lekérdezés végrehajtása és az adatok beolvasása
Ha A SqlCommand
T-SQL Standard kiadás LECT utasítást tartalmaz, a metódussal ExecuteReader
futtathatja. Ez a metódus egy SqlDataReader
objektumot ad vissza, amellyel végighaladhat az eredményeken, és egymás után feldolgozhatja a sorokat. Az adatokat a Read
metódussal lehet lekérni az SqlReader
objektumból. Ez a metódus igaz értéket ad vissza, ha talál egy sort, és hamis értéket, ha nincs több beolvasható sor. Egy sor beolvasása után a sor adatai elérhetővé válnak az SqlReader
objektum mezőiben. A mezők neve megegyezik az eredeti SELECT-utasítás megfelelő oszlopainak nevével. A mezőkben található adatokat azonban csak nem típusos object
elemként lehet lekérni, ezért a használatához át kell alakítani a megfelelő típusra. Az alábbi kód bemutatja, hogyan futtatható a queryCmd
korábban bemutatott parancs az adatok egyenkénti lekéréséhez.
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
...
}
Kivételek és hibák kezelése
Kivételek és hibák számos okból felléphetnek egy adatbázis használata során. Például előfordulhat, hogy egy már nem létező táblát próbál meg elérni. A T-SQL-hibákat a SqlException
típus használatával észlelheti.
Az adatbázis különböző eseményei vagy problémái kivételt válthatnak ki. Az SqlException
objektumnak van egy Errors
tulajdonsága, amely SqlError
-objektumok gyűjteményét tartalmazza. Ezek az objektumok ismertetik a hibák részleteit. Az alábbi példa bemutatja, hogyan lehet észlelni az SqlException
kivételt, és feldolgozni a benne található hibákat.
...
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()}");
}
}
}