Delen via


ADO.NET en LINQ naar SQL

LINQ naar SQL maakt deel uit van de ADO.NET-serie technologieën. Het is gebaseerd op services die worden geleverd door het ADO.NET providermodel. U kunt LINQ daarom combineren met SQL-code met bestaande ADO.NET-toepassingen en huidige ADO.NET-oplossingen migreren naar LINQ naar SQL. In de volgende afbeelding ziet u een algemeen overzicht van de relatie.

LINQ naar SQL en ADO.NET DLinq_3

Verbindingen

U kunt een bestaande ADO.NET verbinding opgeven wanneer u een LINQ maakt naar SQL DataContext. Alle bewerkingen op basis van de DataContext (inclusief query's) maken gebruik van deze opgegeven verbinding. Als de verbinding al is geopend, laat LINQ naar SQL deze staan zoals wanneer u klaar bent.

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

U hebt altijd toegang tot de verbinding en sluit deze zelf met behulp van de Connection eigenschap, zoals in de volgende code:

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

Transacties

U kunt uw eigen databasetransactie voor DataContext opgeven wanneer uw toepassing de transactie al heeft gestart en u wilt dat uw DataContext erbij betrokken wordt.

De voorkeursmethode voor het uitvoeren van transacties met .NET Framework is het gebruik van het TransactionScope object. Met deze methode kunt u gedistribueerde transacties maken die werken tussen databases en andere resourcemanagers die zich in het geheugen bevinden. Voor het starten van transactiebereiken zijn weinig middelen nodig. Ze promoveren zichzelf alleen tot gedistribueerde transacties wanneer er meerdere verbindingen binnen het bereik van de transactie zijn.

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

U kunt deze methode niet gebruiken voor alle databases. De SqlClient-verbinding kan bijvoorbeeld geen systeemtransacties promoveren wanneer deze werkt op een SQL Server 2000-server. In plaats daarvan neemt het automatisch deel aan een volledige, gedistribueerde transactie wanneer het ziet dat er een transactiebereik wordt gebruikt.

Directe SQL-opdrachten

Soms kunt u situaties tegenkomen waarin de mogelijkheid van het DataContext uitvoeren van query's of het indienen van wijzigingen onvoldoende is voor de gespecialiseerde taak die u wilt uitvoeren. In deze omstandigheden kunt u de ExecuteQuery methode gebruiken om SQL-opdrachten uit te geven aan de database en de queryresultaten te converteren naar objecten.

Stel dat de gegevens voor de Customer klasse worden verdeeld over twee tabellen (klant1 en klant2). De volgende query retourneert een reeks Customer objecten:

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

Zolang de kolomnamen in de tabellaire resultaten overeenkomen met kolomeigenschappen van uw entiteitsklasse, maakt LINQ met SQL uw objecten uit een SQL-query.

Parameterwaarden

De ExecuteQuery methode accepteert parameters. Met de volgende code wordt een geparameteriseerde query uitgevoerd:

            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

Opmerking

Parameters worden uitgedrukt in de querytekst met behulp van dezelfde gekrulde notatie die wordt gebruikt door Console.WriteLine() en String.Format(). String.Format() gebruikt de queryreeks die u opgeeft en vervangt de gekrulde parameters met gegenereerde parameternamen, zoals @p0... @p1 , @p(n).

Zie ook