Megosztás a következőn keresztül:


ADO.NET és LINQ az SQL-hez

A LINQ–SQL a ADO.NET technológiák családjának része. A ADO.NET szolgáltatói modell által biztosított szolgáltatásokon alapul. Ezért a LINQ-t az SQL-kódhoz keverheti meglévő ADO.NET alkalmazásokkal, és migrálhatja az aktuális ADO.NET megoldásokat a LINQ-ba az SQL-be. Az alábbi ábra a kapcsolat magas szintű nézetét mutatja be.

LINQ to SQL and ADO.NET

Kapcsolatok

Meglévő ADO.NET kapcsolatot akkor adhat meg, ha LINQ-t hoz létre az SQL-hez DataContext. A (lekérdezéseket is beleértve) összes művelet ezt a DataContext megadott kapcsolatot használja. Ha a kapcsolat már meg van nyitva, a LINQ és az SQL elhagyja azt, mint amikor befejeződött.

string connString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=c:\northwind.mdf;
    Integrated Security=True; Connect Timeout=30; User Instance=True";
SqlConnection nwindConn = new SqlConnection(connString);
nwindConn.Open();

Northwnd interop_db = new Northwnd(nwindConn);

SqlTransaction nwindTxn = nwindConn.BeginTransaction();

try
{
    SqlCommand cmd = new SqlCommand(
        "UPDATE Products SET QuantityPerUnit = 'single item' WHERE ProductID = 3");
    cmd.Connection = nwindConn;
    cmd.Transaction = nwindTxn;
    cmd.ExecuteNonQuery();

    interop_db.Transaction = nwindTxn;

    Product prod1 = interop_db.Products
        .First(p => p.ProductID == 4);
    Product prod2 = interop_db.Products
        .First(p => p.ProductID == 5);
    prod1.UnitsInStock -= 3;
    prod2.UnitsInStock -= 5;

    interop_db.SubmitChanges();

    nwindTxn.Commit();
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
    Console.WriteLine("Error submitting changes... all changes rolled back.");
}

nwindConn.Close();
Dim conString = "Data Source=.\SQLEXPRESS;AttachDbFilename=c:\northwind.mdf; Integrated Security=True;Connect Timeout=30;User Instance=True"
Dim northwindCon = New SqlConnection(conString)
northwindCon.Open()

Dim db = New Northwnd("...")
Dim northwindTransaction = northwindCon.BeginTransaction()

Try
    Dim cmd = New SqlCommand( _
            "UPDATE Products SET QuantityPerUnit = 'single item' " & _
            "WHERE ProductID = 3")
    cmd.Connection = northwindCon
    cmd.Transaction = northwindTransaction
    cmd.ExecuteNonQuery()

    db.Transaction = northwindTransaction

    Dim prod1 = (From prod In db.Products _
                 Where prod.ProductID = 4).First
    Dim prod2 = (From prod In db.Products _
                 Where prod.ProductID = 5).First
    prod1.UnitsInStock -= 3
    prod2.UnitsInStock -= 5

    db.SubmitChanges()

    northwindTransaction.Commit()

Catch e As Exception

    Console.WriteLine(e.Message)
    Console.WriteLine("Error submitting changes... " & _
"all changes rolled back.")
End Try

northwindCon.Close()

A kapcsolatot a tulajdonság használatával Connection bármikor elérheti és bezárhatja, ahogyan az alábbi kódban is látható:

db.Connection.Close();
db.Connection.Close()

Tranzakciók

Saját adatbázis-tranzakciót is megadhat, DataContext ha az alkalmazás már elindította a tranzakciót, és szeretné, hogy részt vegyen benne DataContext .

A .NET-keretrendszer tranzakcióinak elsődleges módszere az TransactionScope objektum használata. Ezzel a módszerrel elosztott tranzakciókat hozhat létre, amelyek adatbázisok és más memóriabeli erőforrás-kezelők között működnek. A tranzakciós hatókörök indításához kevés erőforrás szükséges. Csak akkor léptetik elő magukat elosztott tranzakciókra, ha a tranzakció hatókörén belül több kapcsolat is van.

using (TransactionScope ts = new TransactionScope())
{
    db.SubmitChanges();
    ts.Complete();
}
Using ts As New TransactionScope()
    db.SubmitChanges()
    ts.Complete()
End Using

Ezt a módszert nem használhatja az összes adatbázishoz. Az SqlClient-kapcsolat például nem tudja előléptetni a rendszertranzakciókat, ha egy SQL Server 2000-kiszolgálón működik. Ehelyett automatikusan egy teljes, elosztott tranzakcióhoz csatlakozik, amikor egy tranzakció hatókörének használatát látja.

Közvetlen SQL-parancsok

Időnként olyan helyzetekbe ütközhet, amikor a DataContext módosítások lekérdezésének vagy elküldésének képessége nem elegendő a végrehajtani kívánt speciális feladathoz. Ilyen körülmények között a ExecuteQuery metódussal SQL-parancsokat adhat ki az adatbázisnak, és a lekérdezési eredményeket objektummá alakíthatja.

Tegyük fel például, hogy az Customer osztály adatai két táblán (ügyfél1 és ügyfél2) oszlanak el. A következő lekérdezés objektumsorozatot Customer ad vissza:

            IEnumerable<Customer> results = db.ExecuteQuery<Customer>(
    @"select c1.custid as CustomerID, c2.custName as ContactName
        from customer1 as c1, customer2 as c2
        where c1.custid = c2.custid"
);
    Dim results As IEnumerable(Of Customer) = _
db.ExecuteQuery(Of Customer)( _
"SELECT [c1].custID as CustomerID," & _
    "[c2].custName as ContactName" & _
    "FROM customer1 AS [c1], customer2 as [c2]" & _
    "WHERE [c1].custid = [c2].custid")

Mindaddig, amíg a táblázatos eredmények oszlopnevei egyeznek az entitásosztály oszloptulajdonságaival, a LINQ–SQL létrehozza az objektumokat bármely SQL-lekérdezésből.

Paraméterek

A ExecuteQuery metódus paramétereket fogad el. A következő kód egy paraméteres lekérdezést hajt végre:

            IEnumerable<Customer> results = db.ExecuteQuery<Customer>(
    "select contactname from customers where city = {0}",
    "London"
);
    Dim results As IEnumerable(Of Customer) = _
db.ExecuteQuery(Of Customer)( _
    "SELECT contactname FROM customers WHERE city = {0}, 'London'")
End Sub

Feljegyzés

A paramétereket a lekérdezés szövegében ugyanazzal a görbületi jelöléssel fejezzük ki, amelyet Console.WriteLine() az és String.Format()a . String.Format() a megadott lekérdezési sztringet veszi fel, és a kapcsos zárójeles paramétereket olyan generált paraméternevekkel helyettesíti, mint a @p0... @p1 , @p(n).

Lásd még