ADO.NET ve LINQ to SQL
LINQ to SQL, ADO.NET teknoloji ailesinin bir parçasıdır. ADO.NET sağlayıcı modeli tarafından sağlanan hizmetleri temel alır. Bu nedenle LINQ to SQL kodunu mevcut ADO.NET uygulamalarıyla karıştırabilir ve geçerli ADO.NET çözümlerini LINQ'den SQL'e geçirebilirsiniz. Aşağıdaki çizimde ilişkinin üst düzey bir görünümü sağlanmaktadır.
Bağlantılar
LINQ to SQL DataContextoluştururken mevcut bir ADO.NET bağlantısı sağlayabilirsiniz. 'a DataContext karşı tüm işlemler (sorgular dahil) sağlanan bu bağlantıyı kullanır. Bağlantı zaten açıksa, LINQ to SQL bağlantınızı bitirdiğinizde olduğu gibi bırakır.
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şağıdaki kodda olduğu gibi, her zaman bağlantıya erişebilir ve özelliğini kullanarak Connection bağlantıyı kendiniz kapatabilirsiniz:
db.Connection.Close();
db.Connection.Close()
Hareketler
Uygulamanız işlemi zaten başlattığında ve dahil olmak istediğinizde kendi veritabanı işleminizi DataContext sağlayabilirsinizDataContext.
.NET Framework ile işlem yapmak için tercih edilen yöntem nesnesini kullanmaktır TransactionScope . Bu yaklaşımı kullanarak veritabanları ve diğer bellekte yerleşik kaynak yöneticileri arasında çalışan dağıtılmış işlemler yapabilirsiniz. İşlem kapsamlarının başlatılması için birkaç kaynak gerekir. Yalnızca işlem kapsamında birden çok bağlantı olduğunda kendilerini dağıtılmış işlemlere yükseltiyorlar.
using (TransactionScope ts = new TransactionScope())
{
db.SubmitChanges();
ts.Complete();
}
Using ts As New TransactionScope()
db.SubmitChanges()
ts.Complete()
End Using
Bu yaklaşımı tüm veritabanları için kullanamazsınız. Örneğin, SqlClient bağlantısı bir SQL Server 2000 sunucusunda çalışırken sistem işlemlerini yükseltemez. Bunun yerine, bir işlem kapsamının kullanıldığını her gördüğünde otomatik olarak tam, dağıtılmış bir işleme kaydolr.
Doğrudan SQL Komutları
Bazen, değişiklik sorgulama veya gönderme özelliğinin DataContext gerçekleştirmek istediğiniz özel görev için yetersiz olduğu durumlarla karşılaşabilirsiniz. Bu durumlarda yöntemini kullanarak ExecuteQuery veritabanına SQL komutları verebilir ve sorgu sonuçlarını nesnelere dönüştürebilirsiniz.
Örneğin, sınıfın verilerinin iki tabloya Customer
(customer1 ve customer2) yayıldığını varsayalım. Aşağıdaki sorgu bir nesne dizisi Customer
döndürür:
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")
Tablosal sonuçlardaki sütun adları varlık sınıfınızın sütun özellikleriyle eşleştiği sürece LINQ to SQL nesnelerinizi herhangi bir SQL sorgusundan oluşturur.
Parametreler
ExecuteQuery yöntemi parametreleri kabul eder. Aşağıdaki kod parametreli bir sorgu yürütür:
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
Not
Parametreler, ve String.Format()
tarafından Console.WriteLine()
kullanılan aynı curly gösterimi kullanılarak sorgu metninde ifade edilir. String.Format()
sağladığınız sorgu dizesini alır ve küme ayraçlı parametreleri , @p1
..., @p(n)
gibi @p0
oluşturulan parametre adlarıyla değiştirmektedir.