Instrukcje: Usuwanie wierszy z bazy danych

Wiersze w bazie danych można usunąć, usuwając odpowiednie obiekty LINQ to SQL z kolekcji powiązanej z tabelą. LINQ to SQL tłumaczy zmiany na odpowiednie polecenia SQL DELETE .

LinQ to SQL nie obsługuje ani nie rozpoznaje operacji usuwania kaskadowego. Jeśli chcesz usunąć wiersz w tabeli z ograniczeniami, należy wykonać jedną z następujących zadań:

  • Ustaw regułę ON DELETE CASCADE w ograniczeniu klucza obcego w bazie danych.

  • Użyj własnego kodu, aby najpierw usunąć obiekty podrzędne, które uniemożliwiają usunięcie obiektu nadrzędnego.

W przeciwnym razie jest zgłaszany wyjątek. Zobacz drugi przykład kodu w dalszej części tego tematu.

Uwaga

Można zastąpić domyślne metody LINQ to SQL dla Insertoperacji , Updatei Delete bazy danych. Aby uzyskać więcej informacji, zobacz Dostosowywanie operacji wstawiania, aktualizowania i usuwania.

Deweloperzy korzystający z programu Visual Studio mogą używać Projektant obiektowych do tworzenia procedur składowanych w tym samym celu.

W poniższych krokach przyjęto założenie, że prawidłowe DataContext połączenie z bazą danych Northwind. Aby uzyskać więcej informacji, zobacz Instrukcje: Połączenie do bazy danych.

Aby usunąć wiersz w bazie danych

  1. Wykonaj zapytanie względem bazy danych, aby wiersz został usunięty.

  2. Wywołaj metodę DeleteOnSubmit .

  3. Prześlij zmianę do bazy danych.

Przykład 1

Ten pierwszy przykładowy kod wysyła zapytanie do bazy danych pod kątem szczegółów zamówienia należących do zamówienia nr 11000, oznacza te szczegóły zamówienia do usunięcia i przesyła te zmiany do bazy danych.

// 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

Przykład 2

W tym drugim przykładzie celem jest usunięcie zamówienia (#10250). Kod najpierw sprawdza tabelę, OrderDetails aby sprawdzić, czy kolejność, która ma zostać usunięta, ma tam elementy podrzędne. Jeśli zamówienie ma elementy podrzędne, najpierw dzieci, a następnie zamówienie jest oznaczone do usunięcia. Element DataContext umieszcza rzeczywiste usunięcia w odpowiedniej kolejności, aby usunąć polecenia wysyłane do bazy danych zgodnie z ograniczeniami bazy danych.

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

Zobacz też