Bagikan melalui


ADO.NET dan LINQ to SQL

LINQ to SQL adalah bagian dari keluarga teknologi ADO.NET. Ini didasarkan pada layanan yang disediakan oleh model penyedia ADO.NET. Oleh karena itu Anda dapat mencampur kode LINQ to SQL dengan aplikasi ADO.NET yang ada dan memigrasikan solusi ADO.NET saat ini ke LINQ to SQL. Ilustrasi berikut menunjukkan tampilan langkah-langkah tingkat tinggi terkait hubungan tersebut.

LINQ to SQL and ADO.NET

Koneksi

Anda dapat menyediakan koneksi ADO.NET yang ada saat membuat LINQ to SQL DataContext. Semua operasi pada DataContext (termasuk kueri) menggunakan koneksi yang disediakan ini. Jika koneksi sudah terbuka, LINQ to SQL membiarkannya seperti saat Anda selesai melakukannya.

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

Anda dapat mengakses koneksi dan menutupnya sendiri kapan saja dengan menggunakan properti Connection, seperti pada kode berikut:

db.Connection.Close();
db.Connection.Close()

Transaksi

Anda dapat menyediakan DataContext dengan transaksi database Anda sendiri saat aplikasi Anda telah memulai transaksi dan Anda ingin DataContext Anda terlibat.

Metode yang disukai untuk melakukan transaksi dengan .NET Framework adalah dengan menggunakan objek TransactionScope. Dengan menggunakan pendekatan ini, Anda dapat membuat transaksi terdistribusi yang bekerja di seluruh database dan manajer sumber daya residen memori lainnya. Cakupan transaksi memerlukan sedikit sumber daya untuk memulai. Pendekatan ini mempromosikan diri mereka sendiri ke transaksi terdistribusi hanya ketika ada beberapa koneksi dalam lingkup transaksi.

using (TransactionScope ts = new TransactionScope())
{
    db.SubmitChanges();
    ts.Complete();
}
Using ts As New TransactionScope()
    db.SubmitChanges()
    ts.Complete()
End Using

Anda tidak dapat menggunakan pendekatan ini untuk semua database. Misalnya, koneksi SqlClient tidak dapat mempromosikan transaksi sistem ketika berjalan di server SQL Server 2000. Sebagai gantinya, koneksi ini secara otomatis mendaftar ke transaksi terdistribusi penuh setiap kali melihat ruang lingkup transaksi digunakan.

Perintah SQL Langsung

Terkadang Anda dapat menghadapi situasi di mana kemampuan DataContext untuk mengkueri atau mengirimkan perubahan tidak mencukupi untuk tugas khusus yang ingin Anda lakukan. Dalam keadaan ini, Anda dapat menggunakan metode ExecuteQuery untuk menerbitkan perintah SQL ke database dan mengonversi hasil kueri menjadi objek.

Misalnya, asumsikan bahwa data untuk kelas Customer tersebar di dua tabel (customer1 dan customer2). Kueri berikut mengembalikan urutan objek 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")

Selama nama kolom dalam hasil tabular cocok dengan properti kolom kelas entitas Anda, LINQ untuk SQL membuat objek Anda dari kueri SQL apa pun.

Parameter

Metode ExecuteQuery menerima parameter. Kode berikut mengeksekusi kueri berparameter:

            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

Catatan

Parameter dinyatakan dalam teks kueri dengan menggunakan notasi keriting yang sama yang digunakan oleh Console.WriteLine() dan String.Format(). String.Format() mengambil string kueri yang Anda berikan dan mengganti parameter kurung kurawal dengan nama parameter yang dihasilkan seperti @p0, @p1 …, @p(n).

Lihat juga