Egy ASP.NET-alkalmazás csatlakoztatása az Azure SQL Database-hez

Befejeződött

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