Delen via


Procedure: Rijen uit de database verwijderen

U kunt rijen in een database verwijderen door de bijbehorende LINQ te verwijderen uit de tabelgerelateerde verzameling. LINQ naar SQL vertaalt uw wijzigingen in de juiste SQL-opdrachten DELETE .

LINQ naar SQL biedt geen ondersteuning voor trapsgewijs verwijderen of herkennen. Als u een rij in een tabel met beperkingen wilt verwijderen, moet u een van de volgende taken uitvoeren:

  • Stel de ON DELETE CASCADE regel in de beperking voor refererende sleutels in de database in.

  • Gebruik uw eigen code om eerst de onderliggende objecten te verwijderen die verhinderen dat het bovenliggende object wordt verwijderd.

Anders wordt er een uitzondering gegenereerd. Zie het tweede codevoorbeeld verderop in dit onderwerp.

Notitie

U kunt LINQ overschrijven naar SQL-standaardmethoden voor Insert, Updateen Delete databasebewerkingen. Zie Invoegen, Bijwerken en Verwijderen aanpassen voor meer informatie.

Ontwikkelaars die Visual Studio gebruiken, kunnen de Object Relational Designer gebruiken om opgeslagen procedures voor hetzelfde doel te ontwikkelen.

In de volgende stappen wordt ervan uitgegaan dat een geldige DataContext verbinding tot stand brengt met de Northwind-database. Zie Procedure: Verbinding maken naar een database voor meer informatie.

Een rij in de database verwijderen

  1. Voer een query uit op de database voor de rij die moet worden verwijderd.

  2. Roep de DeleteOnSubmit methode aan.

  3. Verzend de wijziging naar de database.

Voorbeeld 1

In dit eerste codevoorbeeld wordt een query uitgevoerd op de database voor ordergegevens die behoren tot Order 11000, worden deze ordergegevens gemarkeerd voor verwijdering en worden deze wijzigingen naar de database verzonden.

// Query the database for the rows to be deleted.
var deleteOrderDetails =
    from details in db.OrderDetails
    where details.OrderID == 11000
    select details;

foreach (var detail in deleteOrderDetails)
{
    db.OrderDetails.DeleteOnSubmit(detail);
}

try
{
    db.SubmitChanges();
}
catch (Exception e)
{
    Console.WriteLine(e);
    // Provide for exceptions.
}
' Query the database for the rows to be deleted.
Dim deleteOrderDetails = _
    From details In db.OrderDetails() _
    Where details.OrderID = 11000 _
    Select details

For Each detail As OrderDetail In deleteOrderDetails
    db.OrderDetails.DeleteOnSubmit(detail)
Next

Try
    db.SubmitChanges()
Catch ex As Exception
    Console.WriteLine(ex)
    ' Provide for exceptions
End Try

Voorbeeld 2

In dit tweede voorbeeld is het doel om een order te verwijderen (#10250). De code onderzoekt eerst de OrderDetails tabel om te zien of de volgorde die moet worden verwijderd, onderliggende items bevat. Als de bestelling kinderen heeft, worden eerst de kinderen en vervolgens de bestelling gemarkeerd voor verwijdering. Hiermee DataContext worden de werkelijke verwijderingen in de juiste volgorde geplaatst, zodat opdrachten die naar de database worden verzonden, voldoen aan de beperkingen van de database.

Northwnd db = new Northwnd(@"c:\northwnd.mdf");

db.Log = Console.Out;

// Specify order to be removed from database
int reqOrder = 10250;

// Fetch OrderDetails for requested order.
var ordDetailQuery =
    from odq in db.OrderDetails
    where odq.OrderID == reqOrder
    select odq;

foreach (var selectedDetail in ordDetailQuery)
{
    Console.WriteLine(selectedDetail.Product.ProductID);
    db.OrderDetails.DeleteOnSubmit(selectedDetail);
}

// Display progress.
Console.WriteLine("detail section finished.");
Console.ReadLine();

// Determine from Detail collection whether parent exists.
if (ordDetailQuery.Any())
{
    Console.WriteLine("The parent is present in the Orders collection.");
    // Fetch Order.
    try
    {
        var ordFetch =
            (from ofetch in db.Orders
             where ofetch.OrderID == reqOrder
             select ofetch).First();
        db.Orders.DeleteOnSubmit(ordFetch);
        Console.WriteLine("{0} OrderID is marked for deletion.", ordFetch.OrderID);
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
        Console.ReadLine();
    }
}
else
{
    Console.WriteLine("There was no parent in the Orders collection.");
}

// Display progress.
Console.WriteLine("Order section finished.");
Console.ReadLine();

try
{
    db.SubmitChanges();
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
    Console.ReadLine();
}

// Display progress.
Console.WriteLine("Submit finished.");
Console.ReadLine();
Dim db As New Northwnd("c:\northwnd.mdf")

db.Log = Console.Out
' Specify order to be removed from database.
Dim reqOrder As Integer = 10252

' Fetch OrderDetails for requested order.
Dim ordDetailQuery = _
From odq In db.OrderDetails _
Where odq.OrderID = reqOrder _
Select odq

For Each selectedDetail As OrderDetail In ordDetailQuery
    Console.WriteLine(selectedDetail.Product.ProductID)
    db.OrderDetails.DeleteOnSubmit(selectedDetail)
Next

' Display progress.
Console.WriteLine("Detail section finished.")
Console.ReadLine()

' Determine from Detail collection whether parent exists.
If ordDetailQuery.Any Then
    Console.WriteLine("The parent is present in the Orders collection.")
    ' Fetch order.
    Try
        Dim ordFetch = _
        (From ofetch In db.Orders _
         Where ofetch.OrderID = reqOrder _
         Select ofetch).First()

        db.Orders.DeleteOnSubmit(ordFetch)
        Console.WriteLine("{0} OrderID is marked for deletion.,", ordFetch.OrderID)

    Catch ex As Exception
        Console.WriteLine(ex.Message)
        Console.ReadLine()
    End Try

Else
    Console.WriteLine("There was no parent in the Orders collection.")

End If


' Display progress.
Console.WriteLine("Order section finished.")
Console.ReadLine()

Try
    db.SubmitChanges()

Catch ex As Exception
    Console.WriteLine(ex.Message)
    Console.ReadLine()

End Try

' Display progress.
Console.WriteLine("Submit finished.")
Console.ReadLine()

Zie ook