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 to SQL and ADO.NET

Connecties

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 DataContext eigen databasetransactie opgeven wanneer uw toepassing de transactie al heeft gestart en u wilt dat u DataContext betrokken bent.

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 transactiebereiken zijn weinig resources nodig om te starten. 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 wordt automatisch een volledige, gedistribueerde transactie opgenomen wanneer 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.

Parameters

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

Notitie

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