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