LINQ to SQL 是 ADO.NET 系列技術的一部分。 它是以 ADO.NET 提供者模型所提供的服務為基礎。 因此,您可以將 LINQ to SQL 程式代碼與現有的 ADO.NET 應用程式混合,並將目前的 ADO.NET 解決方案遷移至 LINQ to SQL。 下圖插圖提供關係的高層級檢視。
連結
當您建立 LINQ to SQL 時,您可以提供現有的 ADO.NET 連線 DataContext。 針對 DataContext (包括查詢) 的所有作業都會使用此提供的連線。 如果連線已開啟,LINQ to SQL 會在您使用完後保持連線不變。
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()
您可以隨時使用Connection屬性來存取連線並自行關閉,如下列程式代碼所示:
db.Connection.Close();
db.Connection.Close()
交易
當您的應用程式已經啟動交易,而且您想讓DataContext參與時,您可以將您自己的資料庫交易提供給DataContext。
使用 .NET Framework 執行交易的慣用方法是使用 TransactionScope 物件。 藉由使用此方法,您可以建立跨資料庫和其他記憶體常駐資源管理員運作的分散式交易。 交易範圍需要很少的資源才能進行。 只有在交易範圍內有多個連接時,它們才會將自己升階為分散式交易。
using (TransactionScope ts = new TransactionScope())
{
db.SubmitChanges();
ts.Complete();
}
Using ts As New TransactionScope()
db.SubmitChanges()
ts.Complete()
End Using
您無法針對所有資料庫使用此方法。 例如,當 SqlClient 連線針對 SQL Server 2000 伺服器運作時,無法提升系統級交易。 相對地,每當看到正在使用交易範圍時,它就會自動加入一個完整的分散式交易。
直接 SQL 命令
有時候,您可能會遇到查詢或提交變更的能力 DataContext 不足的情況,無法執行您想要執行的特殊工作。 在這些情況下,您可以使用 ExecuteQuery 方法向資料庫發出 SQL 命令,並將查詢結果轉換成 物件。
例如,假設 類別的數據 Customer
分散在兩個數據表上(customer1 和 customer2)。 下列查詢會傳回 物件的序列 Customer
:
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")
只要表格式結果中的數據行名稱符合實體類別的數據行屬性,LINQ to SQL 就會從任何 SQL 查詢中建立物件。
參數
方法 ExecuteQuery 接受參數。 下列程式代碼會執行參數化查詢:
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
備註
參數會在查詢文字中,使用與Console.WriteLine()
和String.Format()
相同的 大括弧表示法來表示。
String.Format()
會採用您提供的查詢字串,並以產生的參數名稱取代大括號參數,例如 @p0
, @p1
..., @p(n)
。