ADO.NET och LINQ till SQL
LINQ till SQL är en del av ADO.NET-serien med tekniker. Den baseras på tjänster som tillhandahålls av ADO.NET-providermodellen. Du kan därför blanda LINQ till SQL-kod med befintliga ADO.NET-program och migrera aktuella ADO.NET lösningar till LINQ till SQL. Följande bild ger en översikt över relationen.
anslutningar
Du kan ange en befintlig ADO.NET anslutning när du skapar en LINQ till SQL DataContext. Alla åtgärder mot DataContext (inklusive frågor) använder den här angivna anslutningen. Om anslutningen redan är öppen lämnar LINQ till SQL den som när du är klar med den.
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()
Du kan alltid komma åt anslutningen och stänga den själv med hjälp Connection av egenskapen, som i följande kod:
db.Connection.Close();
db.Connection.Close()
Transaktioner
Du kan ange din DataContext egen databastransaktion när ditt program redan har initierat transaktionen och du vill att du DataContext ska vara involverad.
Den bästa metoden för att göra transaktioner med .NET Framework är att använda objektet TransactionScope . Med den här metoden kan du göra distribuerade transaktioner som fungerar mellan databaser och andra minnesbaserade resurshanterare. Transaktionsomfång kräver få resurser för att starta. De befordrar sig endast till distribuerade transaktioner när det finns flera anslutningar inom transaktionens omfång.
using (TransactionScope ts = new TransactionScope())
{
db.SubmitChanges();
ts.Complete();
}
Using ts As New TransactionScope()
db.SubmitChanges()
ts.Complete()
End Using
Du kan inte använda den här metoden för alla databaser. SqlClient-anslutningen kan till exempel inte höja upp systemtransaktioner när den fungerar mot en SQL Server 2000-server. I stället registreras automatiskt en fullständig, distribuerad transaktion när ett transaktionsomfång används.
Direct SQL-kommandon
Ibland kan du stöta på situationer där möjligheten DataContext att fråga eller skicka ändringar är otillräcklig för den specialiserade uppgift som du vill utföra. Under dessa omständigheter kan du använda ExecuteQuery metoden för att utfärda SQL-kommandon till databasen och konvertera frågeresultatet till objekt.
Anta till exempel att data för Customer
klassen är spridda över två tabeller (kund1 och kund2). Följande fråga returnerar en sekvens med Customer
objekt:
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")
Så länge kolumnnamnen i tabellresultatet matchar kolumnegenskaperna för din entitetsklass skapar LINQ till SQL dina objekt från valfri SQL-fråga.
Parametrar
Metoden ExecuteQuery accepterar parametrar. Följande kod kör en parametriserad fråga:
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
Kommentar
Parametrar uttrycks i frågetexten med samma kladdiga notation som används av Console.WriteLine()
och String.Format()
. String.Format()
tar frågesträngen som du anger och ersätter de klammerparenteserade parametrarna med genererade parameternamn som @p0
, @p1
..., @p(n)
.