Aracılığıyla paylaş


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.

LINQ to SQL and ADO.NET

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 @p0oluşturulan parametre adlarıyla değiştirmektedir.

Ayrıca bkz.