Sdílet prostřednictvím


ADO.NET a LINQ to SQL

LINQ to SQL je součástí ADO.NET řady technologií. Je založená na službách poskytovaných modelem poskytovatele ADO.NET. Z toho důvodu můžete kombinovat kód LINQ to SQL se stávajícími aplikacemi ADO.NET a migrovat aktuální ADO.NET řešení do LINQ to SQL. Následující obrázek znázorňuje vztah na vysoké úrovni.

LINQ to SQL and ADO.NET

Propojení

Existující ADO.NET připojení můžete zadat při vytváření LINQ to SQL DataContext. Všechna operace s DataContext (včetně dotazů) používají toto poskytnuté připojení. Pokud je připojení již otevřené, LINQ to SQL ponechá tak, jak je to, když jste s ním hotovi.

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

K připojení můžete kdykoli přistupovat a zavřít ho sami pomocí Connection vlastnosti, jak je znázorněno v následujícím kódu:

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

Transakce

Můžete zadat DataContext vlastní databázovou transakci, když vaše aplikace již iniciovala transakci a chcete DataContext , aby byla zahrnuta.

Upřednostňovanou metodou provádění transakcí s rozhraním .NET Framework je použití objektu TransactionScope . Pomocí tohoto přístupu můžete provádět distribuované transakce, které fungují napříč databázemi a dalšími správci prostředků rezidentů paměti. Obory transakcí vyžadují spuštění několika prostředků. Propagují se na distribuované transakce pouze v případech, kdy je v rozsahu transakce více připojení.

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

Tento přístup nelze použít pro všechny databáze. Například připojení SqlClient nemůže zvýšit úroveň systémových transakcí, když funguje na serveru SQL Server 2000. Místo toho se automaticky zasadí do úplné distribuované transakce vždy, když uvidí použitý obor transakce.

Přímé příkazy SQL

Někdy můžete narazit na situace, kdy schopnost DataContext dotazovat nebo odeslat změny není dostatečná pro specializovanou úlohu, kterou chcete provést. Za těchto okolností můžete použít metodu ExecuteQuery k vydání příkazů SQL pro databázi a převod výsledků dotazu na objekty.

Předpokládejme například, že data pro Customer třídu jsou rozložená do dvou tabulek (customer1 a customer2). Následující dotaz vrátí posloupnost 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")

Pokud názvy sloupců v tabulkových výsledcích odpovídají vlastnostem sloupce vaší třídy entity, vytvoří LINQ to SQL objekty z jakéhokoli dotazu SQL.

Parametry

Metoda ExecuteQuery přijímá parametry. Následující kód spustí parametrizovaný dotaz:

            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

Poznámka:

Parametry jsou vyjádřeny v textu dotazu pomocí stejného složeného zápisu, který Console.WriteLine() používá a String.Format(). String.Format() přebírá řetězec dotazu, který zadáte, a nahradí složené parametry vygenerovanými názvy parametrů, jako @p0je například , @p1 ..., @p(n).

Viz také