Aktualizowanie elementu TableAdapter w celu używania sprzężeń JOIN (C#)

przez Scott Mitchell

Pobierz kod lub Pobierz plik PDF

Podczas pracy z bazą danych często żądają danych rozłożonych między wieloma tabelami. Aby pobrać dane z dwóch różnych tabel, można użyć skorelowanego podzapytania lub operacji JOIN. W tym samouczku porównano skorelowane podzapytania i składnię JOIN przed rozpoczęciem tworzenia TableAdapter zawierającego SPRZĘŻENIe w jego głównym zapytaniu.

Wprowadzenie

W przypadku relacyjnych baz danych dane, z którymi jesteśmy zainteresowani, są często rozłożone na wiele tabel. Na przykład podczas wyświetlania informacji o produkcie warto wyświetlić listę odpowiednich nazw kategorii i dostawców produktów. Tabela Products ma CategoryID i SupplierID wartości, ale rzeczywista nazwa kategorii i dostawcy znajdują się odpowiednio w tabelach Categories i Suppliers.

Aby pobrać informacje z innej powiązanej tabeli, można użyć skorelowanych podkwerend lub JOINs. Skorelowane podzapytanie jest zagnieżdżoną kwerendą SELECT, która odwołuje się do kolumn w zewnętrznym zapytaniu. Na przykład w samouczku Tworzenie warstwy dostępu do danych zostały użyte dwa skorelowane podzapytania w zapytaniu głównym ProductsTableAdapter s w celu zwrócenia kategorii i nazw dostawców dla każdego produktu. JOIN to konstrukcja SQL, która scala powiązane wiersze z dwóch różnych tabel. Do wyświetlania informacji o kategorii obok każdego produktu użyto JOIN w danych zapytania za pomocą samouczka kontrolki kontrolki SqlDataSource .

Przyczyna abstained z używania JOIN s z TableAdapters wynika z faktu, że ograniczenia w Kreatorze TableAdapter s umożliwiają automatyczne generowanie odpowiednich instrukcji INSERT, UPDATEi DELETE. Dokładniej mówiąc, jeśli główne zapytanie TableAdapter s zawiera dowolne JOIN s, TableAdapter nie może utworzyć instrukcji SQL ad hoc ani procedur składowanych dla właściwości InsertCommand, UpdateCommandi DeleteCommand.

W tym samouczku zostaną krótko porównane i powiązane podzapytania, a JOIN s przed rozpoczęciem eksplorowania sposobu tworzenia TableAdapter zawierającego JOIN s w jego głównym zapytaniu.

Porównywanie i różnicowanie skorelowanych podzapytań orazJOIN s

Odwołaj, że ProductsTableAdapter utworzone w pierwszym samouczku w Northwind DataSet używa skorelowanego podzapytań, aby przywrócić każde odpowiednie produkty i nazwę dostawcy. Poniżej przedstawiono zapytanie główne ProductsTableAdapter s.

SELECT ProductID, ProductName, SupplierID, CategoryID, 
       QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, 
       ReorderLevel, Discontinued,
       (SELECT CategoryName FROM Categories WHERE Categories.CategoryID = 
            Products.CategoryID) as CategoryName, 
       (SELECT CompanyName FROM Suppliers WHERE Suppliers.SupplierID = 
            Products.SupplierID) as SupplierName
FROM Products

Dwa skorelowane podzapytania — (SELECT CategoryName FROM Categories WHERE Categories.CategoryID = Products.CategoryID) i (SELECT CompanyName FROM Suppliers WHERE Suppliers.SupplierID = Products.SupplierID) — są SELECT zapytania, które zwracają pojedynczą wartość na produkt jako dodatkową kolumnę na liście kolumn zewnętrznej SELECT instrukcji s.

Alternatywnie można użyć JOIN, aby zwrócić każdy dostawca produktu i nazwę kategorii. Poniższe zapytanie zwraca te same dane wyjściowe co powyżej, ale używa JOIN s zamiast podkwerend:

SELECT ProductID, ProductName, Products.SupplierID, Products.CategoryID, 
       QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, 
       ReorderLevel, Discontinued,
       Categories.CategoryName, 
       Suppliers.CompanyName as SupplierName
FROM Products
    LEFT JOIN Categories ON
        Categories.CategoryID = Products.CategoryID
    LEFT JOIN Suppliers ON
        Suppliers.SupplierID = Products.SupplierID

JOIN scala rekordy z jednej tabeli z rekordami z innej tabeli na podstawie niektórych kryteriów. Na przykład w powyższym zapytaniu LEFT JOIN Categories ON Categories.CategoryID = Products.CategoryID instruuje SQL Server, aby scalić każdy rekord produktu z rekordem kategorii, którego wartość CategoryID jest zgodna z wartością CategoryID produktu. Scalony wynik pozwala nam korzystać z odpowiednich pól kategorii dla każdego produktu (na przykład CategoryName).

Note

JOIN s są często używane podczas wykonywania zapytań dotyczących danych z relacyjnych baz danych. Jeśli jesteś nowym użytkownikiem składni JOIN lub potrzebujesz pędzla w górę w celu użycia, I d zalecamy zapoznanie się z samouczkiem dotyczącym sprzężenia SQL w szkołach W3. Jest JOIN to również, że odczytywanie to sekcje podstawowe i podzapytania dotyczące usługi SQL Books Online.

Ze względu na to, że JOIN s i skorelowane podzapytania mogą być używane do pobierania powiązanych danych z innych tabel, wielu deweloperów pozostawiła swoje głowice i zastanawia się, które podejście ma być używane. Wszystkie Gurus języka SQL, do których odpowiedziano te same działania, tak samo, że nie jest to bardzo istotne dla wydajności, ponieważ SQL Server będzie generować bardzo identyczne plany wykonania. W tym celu należy użyć techniki, z którą ty i Twój zespół. Warto zwrócić uwagę na to, że po przeprowadzeniu tej porady eksperci natychmiast wyrażają preferencję JOIN s za pośrednictwem skorelowanych podzapytań.

Podczas kompilowania warstwy dostępu do danych przy użyciu wpisanych zestawów DataSet narzędzia działają lepiej podczas korzystania z podzapytań. W szczególności Kreator TableAdapter s nie generuje automatycznie odpowiednich instrukcji INSERT, UPDATEi DELETE, jeśli główne zapytanie zawiera wszystkie JOIN s, ale te instrukcje zostaną automatycznie wygenerowane w przypadku użycia skorelowanych podzapytań.

Aby zbadać to niedoskonałość, należy utworzyć tymczasowy zestaw danych o określonym typie w folderze ~/App_Code/DAL. W Kreatorze konfiguracji TableAdapter wybierz, aby użyć instrukcji SQL ad hoc i wprowadź następujące zapytanie SELECT (patrz rysunek 1):

SELECT ProductID, ProductName, Products.SupplierID, Products.CategoryID, 
       QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, 
       ReorderLevel, Discontinued,
       Categories.CategoryName, 
       Suppliers.CompanyName as SupplierName
FROM Products
    LEFT JOIN Categories ON
        Categories.CategoryID = Products.CategoryID
    LEFT JOIN Suppliers ON
        Suppliers.SupplierID = Products.SupplierID

wprowadzić głównej kwerendy zawierającej sprzężenia

Rysunek 1. Wprowadź główną kwerendę zawierającą JOIN s (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Domyślnie TableAdapter automatycznie tworzy instrukcje INSERT, UPDATEi DELETE na podstawie zapytania głównego. Po kliknięciu przycisku Zaawansowane można zobaczyć, że ta funkcja jest włączona. Pomimo tego ustawienia TableAdapter nie będzie mógł utworzyć instrukcji INSERT, UPDATEi DELETE, ponieważ główne zapytanie zawiera JOIN.

Wprowadź zapytanie główne zawierające sprzężenia

Rysunek 2. wprowadzanie głównego zapytania zawierającego JOIN s

Kliknij przycisk Zakończ, aby zakończyć pracę kreatora. W tym momencie Projektant zestawu danych s będzie zawierać pojedyncze TableAdapter z elementem DataTable z kolumnami dla każdego z pól zwróconych na liście kolumn SELECT zapytania s. Obejmuje to CategoryName i SupplierName, jak pokazano na rysunku 3.

Element DataTable zawiera kolumnę dla każdego pola zwróconego na liście kolumn.

Rysunek 3. tabela DataTable zawiera kolumnę dla każdego pola zwróconego na liście kolumn

Gdy element DataTable ma odpowiednie kolumny, TableAdapter nie ma wartości dla właściwości InsertCommand, UpdateCommandi DeleteCommand. Aby to potwierdzić, kliknij TableAdapter w projektancie, a następnie przejdź do okno Właściwości. Zobaczysz, że właściwości InsertCommand, UpdateCommandi DeleteCommand są ustawione na wartość (brak).

właściwości InsertCommand, UpdateCommand i DeleteCommand są ustawione na (None)

Rysunek 4. właściwości InsertCommand, UpdateCommandi DeleteCommand są ustawione na (brak) (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Aby obejść ten brak, możemy ręcznie dostarczyć instrukcje i parametry SQL dla InsertCommand, UpdateCommandi DeleteCommand właściwości za pośrednictwem okno Właściwości. Alternatywnie można rozpocząć od skonfigurowania zapytania głównego TableAdapter s, aby nie zawierały żadnych JOIN s. Dzięki temu instrukcje INSERT, UPDATEi DELETE będą generowane automatycznie dla nas. Po zakończeniu działania kreatora można ręcznie zaktualizować TableAdapter SelectCommand z okno Właściwości, aby zawierał składnię JOIN.

Chociaż to podejście działa, jest bardzo kruchy w przypadku korzystania z zapytań SQL ad hoc, ponieważ za każdym razem, gdy zapytanie główne TableAdapter s zostało ponownie skonfigurowane za pośrednictwem kreatora, automatycznie generowane instrukcje INSERT, UPDATEi DELETE. Oznacza to, że wszystkie wprowadzone później modyfikacje zostaną utracone, jeśli zostanie kliknięty prawym przyciskiem myszy w TableAdapter, wybierz pozycję Konfiguruj z menu kontekstowego, a następnie ponownie Ukończ pracę kreatora.

Brittleness z TableAdapter s INSERTgenerowanym automatycznie, UPDATEi DELETE są na szczęście, ograniczone do instrukcji SQL ad hoc. Jeśli TableAdapter korzysta z procedur składowanych, można dostosować SelectCommand, InsertCommand, UpdateCommandlub DeleteCommand procedury składowane, a następnie ponownie uruchomić Kreatora konfiguracji TableAdapter bez konieczności obawowania, że procedury składowane zostaną zmodyfikowane.

W ciągu następnych kilku kroków utworzymy TableAdapter, która początkowo korzysta z głównego zapytania, które pomija wszystkie JOIN s, aby odpowiednie procedury składowane INSERT, Update i DELETE będą generowane automatycznie. Następnie zaktualizujemy SelectCommand tak, aby używała JOIN, która zwraca dodatkowe kolumny z powiązanych tabel. Na koniec utworzymy odpowiednią klasę warstwy logiki biznesowej i wykażemy użycie TableAdapter na stronie sieci Web ASP.NET.

Krok 1. Tworzenie TableAdapter przy użyciu uproszczonego zapytania głównego

W tym samouczku dodamy TableAdapter i silnie wpisaną wartość DataTable dla tabeli Employees w zestawie danych NorthwindWithSprocs. Tabela Employees zawiera pole ReportsTo, które określa EmployeeID menedżera pracowników. Na przykład pracownik Anne Dodsworth ma ReportTo wartość 5, czyli EmployeeID z Steven Buchanan. W związku z tym Anne raporty do Steven, jego Menedżera. Wraz z raportowaniem każdej wartości ReportsTo pracownika może być również konieczne pobranie nazwy swojego menedżera. Można to zrobić przy użyciu JOIN. Jednak przy pierwszym tworzeniu TableAdapter przy użyciu JOIN uniemożliwia kreatorowi automatyczne generowanie odpowiednich funkcji INSERT, Update i DELETE. W związku z tym zaczniemy od utworzenia elementu TableAdapter, którego zapytanie główne nie zawiera żadnych JOIN s. Następnie w kroku 2 będziemy aktualizować główną procedurę przechowywaną zapytania, aby pobrać nazwę Menedżera za pośrednictwem JOIN.

Zacznij od otwarcia NorthwindWithSprocs zestawu danych w folderze ~/App_Code/DAL. Kliknij prawym przyciskiem myszy projektanta, wybierz opcję Dodaj z menu kontekstowego i wybierz element menu TableAdapter. Spowoduje to uruchomienie Kreatora konfiguracji TableAdapter. Zgodnie z ilustracją 5 przedstawia Kreator tworzy nowe procedury składowane i klika dalej. Aby uzyskać odświeżacz dotyczący tworzenia nowych procedur składowanych z poziomu kreatora TableAdapter s, zapoznaj się z tematem Tworzenie nowych procedur składowanych dla określonego typu zestawu danych s TableAdapters .

wybrać opcję Utwórz nowe procedury składowane

Rysunek 5. Wybierz opcję Utwórz nowe procedury składowane (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Użyj następującej instrukcji SELECT dla głównego zapytania TableAdapter s:

SELECT EmployeeID, LastName, FirstName, Title, HireDate, ReportsTo, Country
FROM Employees

Ponieważ to zapytanie nie zawiera żadnych JOIN s, Kreator TableAdapter automatycznie utworzy procedury składowane z odpowiednimi INSERT, UPDATEi DELETE instrukcjami, jak również procedurę przechowywaną do wykonywania zapytania głównego.

Poniższy krok pozwala nam nazwać procedury składowane TableAdapter. Użyj nazw Employees_Select, Employees_Insert, Employees_Updatei Employees_Delete, jak pokazano na rysunku 6.

Nazwa procedury składowane TableAdapter

Ilustracja 6. Nazwij procedury składowane TableAdapter (kliknij, aby wyświetlić obraz w pełnym rozmiarze)

Ostatni krok monituje nas o nazwę metod TableAdapter. Użyj Fill i GetEmployees jako nazw metod. Pamiętaj również, aby pozostawić zaznaczone pole wyboru Utwórz metody do wysyłania aktualizacji bezpośrednio do bazy danych (GenerateDBDirectMethods).

Nazwij metody TableAdapter i GetEmployees

Rysunek 7. Nazwij metody TableAdapter s Fill i GetEmployees (kliknij, aby wyświetlić obraz w pełnym rozmiarze)

Po zakończeniu działania kreatora Poświęć chwilę na przeanalizowanie procedur składowanych w bazie danych. Powinny być widoczne cztery nowe: Employees_Select, Employees_Insert, Employees_Updatei Employees_Delete. Następnie sprawdź EmployeesDataTable i EmployeesTableAdapter utworzone. Element DataTable zawiera kolumnę dla każdego pola zwróconego przez zapytanie główne. Kliknij TableAdapter, a następnie przejdź do okno Właściwości. Zobaczysz, że właściwości InsertCommand, UpdateCommandi DeleteCommand są poprawnie skonfigurowane do wywoływania odpowiednich procedur składowanych.

TableAdapter obejmuje możliwości wstawiania, aktualizowania i usuwania

Ilustracja 8. TableAdapter zawiera możliwości INSERT, Update i Delete (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Przy użyciu automatycznie utworzonych i InsertCommand``UpdateCommand, aktualizacji i właściwości przechowywanych procedury składowane INSERT, Update i DeleteCommand są gotowe do dostosowania procedury składowanej SelectCommand s w celu zwrócenia dodatkowych informacji na temat każdego z menedżerów pracowników. W szczególnych przypadkach należy zaktualizować Employees_Select procedury składowanej, aby użyć JOIN i zwrócić wartości FirstName i LastName Menedżera. Po zaktualizowaniu procedury składowanej należy zaktualizować element DataTable, aby zawierał te dodatkowe kolumny. Te dwa zadania zostaną przedstawione w krokach 2 i 3.

Krok 2. Dostosowywanie procedury składowanej w celu uwzględnieniaJOIN

Zacznij od przechodzenia do Eksplorator serwera, przechodzenie do szczegółów folderu procedur składowanych Northwind Database i otwieranie Employees_Select procedury składowanej. Jeśli nie widzisz tej procedury składowanej, kliknij prawym przyciskiem myszy folder procedury składowane i wybierz polecenie Odśwież. Zaktualizuj procedurę składowaną, tak aby używała LEFT JOIN do zwrócenia najpierw Menedżera i nazwisko:

SELECT Employees.EmployeeID, Employees.LastName, 
       Employees.FirstName, Employees.Title, 
       Employees.HireDate, Employees.ReportsTo, 
       Employees.Country,
       Manager.FirstName as ManagerFirstName, 
       Manager.LastName as ManagerLastName
FROM Employees
    LEFT JOIN Employees AS Manager ON
        Employees.ReportsTo = Manager.EmployeeID

Po zaktualizowaniu instrukcji SELECT Zapisz zmiany, przechodząc do menu plik i wybierając pozycję Zapisz Employees_Select. Alternatywnie możesz kliknąć ikonę Zapisz na pasku narzędzi lub nacisnąć klawisze CTRL + S. Po zapisaniu zmian kliknij prawym przyciskiem myszy Employees_Select procedury składowanej w Eksplorator serwera i wybierz polecenie Execute (wykonaj). Spowoduje to uruchomienie procedury składowanej i wyświetlenie jej wyników w oknie danych wyjściowych (zobacz rysunek 9).

wyniki procedur składowanych są wyświetlane w Okno Dane wyjściowe

Ilustracja 9. wyniki procedur składowanych są wyświetlane w okno dane wyjściowe (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Krok 3. aktualizowanie kolumn DataTable s

W tym momencie Employees_Select procedura składowana zwraca ManagerFirstName i ManagerLastName wartości, ale w EmployeesDataTable brakuje tych kolumn. Te brakujące kolumny można dodać do elementu DataTable na jeden z dwóch sposobów:

  • Ręcznie — kliknij prawym przyciskiem myszy element DataTable w Projektancie obiektów DataSet, a następnie w menu Dodaj wybierz pozycję kolumna. Następnie można nazwać kolumnę i odpowiednio ustawić jej właściwości.
  • Automatycznie — Kreator konfiguracji TableAdapter zaktualizuje kolumny DataTable s w celu odzwierciedlenia pól zwracanych przez SelectCommand procedury składowanej. W przypadku korzystania z instrukcji SQL ad hoc kreator usunie również właściwości InsertCommand, UpdateCommandi DeleteCommand, ponieważ SelectCommand zawiera teraz JOIN. Jednak w przypadku korzystania z procedur składowanych te właściwości poleceń pozostają nienaruszone.

Dodaliśmy ręczne dodawaj kolumny DataTable w poprzednich samouczkach, w tym wzorzec/szczegóły przy użyciu listy punktowanej rekordów głównych z szczegółami DataList i przekazywania plików, a my poznamy ten proces ponownie w następnym samouczku. Jednak w tym samouczku użyjemy automatycznej metody za pomocą Kreatora konfiguracji TableAdapter.

Zacznij od kliknięcia prawym przyciskiem myszy EmployeesTableAdapter i wybrania opcji Konfiguruj z menu kontekstowego. Spowoduje to wyświetlenie Kreatora konfiguracji TableAdapter, w którym są wyświetlane procedury składowane używane do wybierania, wstawiania, aktualizowania i usuwania oraz ich wartości zwracane i parametry (jeśli istnieją). Ten Kreator zawiera rysunek 10. W tym miejscu możemy zobaczyć, że Employees_Select procedura składowana zwróci teraz pola ManagerFirstName i ManagerLastName.

Kreator wyświetla listę zaktualizowanych kolumn dla procedury składowanej Employees_Select

Ilustracja 10. Kreator wyświetla zaktualizowaną listę kolumn dla Employees_Select procedury składowanej (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Aby zakończyć pracę kreatora, kliknij przycisk Zakończ. Po powrocie do projektanta obiektów DataSet EmployeesDataTable obejmuje dwie dodatkowe kolumny: ManagerFirstName i ManagerLastName.

EmployeesDataTable zawiera dwie nowe kolumny

Ilustracja 11. EmployeesDataTable zawiera dwie nowe kolumny (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Aby zilustrować, że uaktualniona Employees_Select procedura składowana obowiązuje i że możliwości wstawiania, aktualizowania i usuwania TableAdapter są nadal funkcjonalne, Utwórz stronę sieci Web, która umożliwia użytkownikom wyświetlanie i usuwanie pracowników. Przed utworzeniem takiej strony musimy jednak najpierw utworzyć nową klasę w warstwie logiki biznesowej do pracy z pracownikami z zestawu danych NorthwindWithSprocs. W kroku 4 utworzymy klasę EmployeesBLLWithSprocs. W kroku 5 będziemy używać tej klasy ze strony ASP.NET.

Krok 4. Implementowanie warstwy logiki biznesowej

Utwórz nowy plik klasy w folderze ~/App_Code/BLL o nazwie EmployeesBLLWithSprocs.cs. Ta klasa naśladuje semantykę istniejącej klasy EmployeesBLL, tylko ten nowy z nich zapewnia mniejszą liczbę metod i używa NorthwindWithSprocs zestawu danych (zamiast zestawu danych Northwind). Dodaj następujący kod do klasy EmployeesBLLWithSprocs.

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using NorthwindWithSprocsTableAdapters;
[System.ComponentModel.DataObject]
public class EmployeesBLLWithSprocs
{
    private EmployeesTableAdapter _employeesAdapter = null;
    protected EmployeesTableAdapter Adapter
    {
        get
        {
            if (_employeesAdapter == null)
                _employeesAdapter = new EmployeesTableAdapter();
            return _employeesAdapter;
        }
    }
    [System.ComponentModel.DataObjectMethodAttribute
        (System.ComponentModel.DataObjectMethodType.Select, true)]
    public NorthwindWithSprocs.EmployeesDataTable GetEmployees()
    {
        return Adapter.GetEmployees();
    }
    [System.ComponentModel.DataObjectMethodAttribute
        (System.ComponentModel.DataObjectMethodType.Delete, true)]
    public bool DeleteEmployee(int employeeID)
    {
        int rowsAffected = Adapter.Delete(employeeID);
        // Return true if precisely one row was deleted, otherwise false
        return rowsAffected == 1;
    }
}

Właściwość Adapter EmployeesBLLWithSprocs klasy s zwraca wystąpienie NorthwindWithSprocs EmployeesTableAdapterzestawu danych. Jest on używany przez metody GetEmployees i DeleteEmployee klasy. Metoda GetEmployees wywołuje EmployeesTableAdapter GetEmployees odpowiadającą metodzie, która wywołuje Employees_Select procedurę składowaną i wypełnia wyniki w EmployeeDataTable. Metoda DeleteEmployee podobnie wywołuje metodę EmployeesTableAdapter s Delete, która wywołuje Employees_Delete procedurę składowaną.

Krok 5. Praca z danymi w warstwie prezentacji

Po zakończeniu EmployeesBLLWithSprocsj klasy wszystko gotowe do pracy z danymi pracownika za pomocą strony ASP.NET. Otwórz stronę JOINs.aspx w folderze AdvancedDAL i przeciągnij widok GridView z przybornika do projektanta, ustawiając jego właściwość ID na Employees. Następnie w tagu inteligentnym GridView należy powiązać siatkę z nową kontrolką ObjectDataSource o nazwie EmployeesDataSource.

Skonfiguruj element ObjectDataSource do używania klasy EmployeesBLLWithSprocs i z kart wybierz i Usuń upewnij się, że na listach rozwijanych są wybrane metody GetEmployees i DeleteEmployee. Kliknij przycisk Zakończ, aby zakończyć konfigurację elementu ObjectDataSource s.

skonfigurować element ObjectDataSource do używania klasy EmployeesBLLWithSprocs

Ilustracja 12. Konfigurowanie elementu ObjectDataSource do używania klasy EmployeesBLLWithSprocs (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

, aby element ObjectDataSource używał metod GetEmployees i DeleteEmployee

Ilustracja 13. aby element ObjectDataSource używał metod GetEmployees i DeleteEmployee (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Program Visual Studio doda BoundField do widoku GridView dla każdej z kolumn EmployeesDataTable s. Usuń wszystkie te BoundFields z wyjątkiem Title, LastName, FirstName, ManagerFirstNamei ManagerLastName, a następnie zmień nazwę HeaderText właściwości dla ostatnich czterech BoundFields na nazwisko, imię, nazwisko, imię i nazwisko, a Menedżer s odpowiednio nazwisko.

Aby umożliwić użytkownikom usuwanie pracowników z tej strony, musimy wykonać dwie rzeczy. Najpierw poinstruuj widok GridView, aby udostępnić możliwości usuwania, sprawdzając opcję Włącz usuwanie z jej tagu inteligentnego. Następnie zmień właściwość OldValuesParameterFormatString ObjectDataSource s z wartości ustawionej przez kreatora ObjectDataSource (original_{0}) na wartość domyślną ({0}). Po wprowadzeniu tych zmian, znaczniki deklaratywne GridView i ObjectDataSource s powinny wyglądać podobnie do następujących:

<asp:GridView ID="Employees" runat="server" AutoGenerateColumns="False" 
    DataKeyNames="EmployeeID" DataSourceID="EmployeesDataSource">
    <Columns>
        <asp:CommandField ShowDeleteButton="True" />
        <asp:BoundField DataField="Title" 
            HeaderText="Title" 
            SortExpression="Title" />
        <asp:BoundField DataField="LastName" 
            HeaderText="Last Name" 
            SortExpression="LastName" />
        <asp:BoundField DataField="FirstName" 
            HeaderText="First Name" 
            SortExpression="FirstName" />
        <asp:BoundField DataField="ManagerFirstName" 
            HeaderText="Manager's First Name" 
            SortExpression="ManagerFirstName" />
        <asp:BoundField DataField="ManagerLastName" 
            HeaderText="Manager's Last Name" 
            SortExpression="ManagerLastName" />
    </Columns>
</asp:GridView>
<asp:ObjectDataSource ID="EmployeesDataSource" runat="server" 
    DeleteMethod="DeleteEmployee" OldValuesParameterFormatString="{0}" 
    SelectMethod="GetEmployees" TypeName="EmployeesBLLWithSprocs">
    <DeleteParameters>
        <asp:Parameter Name="employeeID" Type="Int32" />
    </DeleteParameters>
</asp:ObjectDataSource>

Przetestuj stronę, odwiedzając ją za pomocą przeglądarki. Jak pokazano na rysunku 14, na stronie zostanie wyświetlona lista każdego pracownika i jego nazwa kierownika (przy założeniu, że ma ona jeden).

SPRZĘŻENIa w procedurze składowanej Employees_Select zwraca nazwę Menedżera

Ilustracja 14. JOIN w procedurze składowanej Employees_Select zwraca nazwę Menedżera (kliknij, aby wyświetlić obraz w pełnym rozmiarze)

Kliknięcie przycisku Usuń powoduje uruchomienie usuwania przepływu pracy, który culminates wykonywanie procedury składowanej Employees_Delete. Jednak próba DELETE instrukcji w procedurze składowanej kończy się niepowodzeniem z powodu naruszenia ograniczenia klucza obcego (patrz rysunek 15). W każdym przypadku każdy pracownik ma jeden lub więcej rekordów w tabeli Orders, co powoduje niepowodzenie usuwania.

usunięcie pracownika, który ma odpowiednie zamówienia, spowoduje naruszenie ograniczenia klucza obcego

Ilustracja 15. Usuwanie pracownika z odpowiednimi zamówieniami skutkuje naruszeniem ograniczenia klucza obcego (kliknij, aby wyświetlić obraz w pełnym rozmiarze)

Aby zezwolić na usunięcie pracownika, możesz:

  • Zaktualizuj ograniczenie klucza obcego do usuwania kaskadowego,
  • Ręcznie usuń rekordy z tabeli Orders dla pracowników, które chcesz usunąć.
  • Zaktualizuj procedurę składowaną Employees_Delete, aby najpierw usunąć powiązane rekordy z tabeli Orders przed usunięciem rekordu Employees. Omawiana technika została omówiona w istniejących procedurach składowanych w samouczku TableAdapters zestawu danych .

Jestem tym ćwiczeniem dla czytnika.

Podsumowanie

Podczas pracy z relacyjnymi bazami danych często zapytania pobierają dane z wielu powiązanych tabel. Skorelowane podzapytania i JOIN s zapewniają dwie różne techniki uzyskiwania dostępu do danych z powiązanych tabel w zapytaniu. W poprzednich samouczkach najczęściej używano skorelowanych podkwerend, ponieważ TableAdapter nie może automatycznie generować instrukcji INSERT, UPDATEi DELETE dla zapytań obejmujących JOIN s. Te wartości można podać ręcznie, podczas korzystania z instrukcji SQL ad hoc wszystkie dostosowania zostaną nadpisywane po zakończeniu działania Kreatora konfiguracji TableAdapter.

Na szczęście TableAdapters utworzone przy użyciu procedur składowanych nie pogorszą się od tych samych brittleness, co te utworzone przy użyciu instrukcji SQL ad hoc. W związku z tym jest możliwe utworzenie elementu TableAdapter, którego główne zapytanie używa JOIN podczas korzystania z procedur składowanych. W tym samouczku przedstawiono sposób tworzenia takich TableAdapter. Uruchomiono za pomocą zapytania SELECT JOIN-less dla zapytania głównego TableAdapter s, aby odpowiednie procedury składowane INSERT, Update i DELETE byłyby tworzone na podstawie autostartu. Po zakończeniu konfiguracji początkowej TableAdapter s podaliśmy procedurę składowaną SelectCommand, aby użyć JOIN i ponownie uruchomiła Kreatora konfiguracji TableAdapter w celu zaktualizowania kolumn EmployeesDataTable s.

Ponowne uruchomienie Kreatora konfiguracji programu TableAdapter automatycznie zaktualizowała kolumny EmployeesDataTable, aby odzwierciedlały pola danych zwracane przez Employees_Select procedurę składowaną. Alternatywnie, możemy dodać te kolumny ręcznie do elementu DataTable. Będziemy eksplorować Ręczne dodawanie kolumn do tabeli DataTable w następnym samouczku.

Szczęśliwe programowanie!

Informacje o autorze

Scott Mitchell, autor siedmiu grup ASP/ASP. NET Books i założyciel of 4GuysFromRolla.com, pracował z technologiami sieci Web firmy Microsoft od czasu 1998. Scott działa jako niezależny konsultant, trainer i składnik zapisywania. Jego Najnowsza książka to Sams ASP.NET 2,0 w ciągu 24 godzin. Można go osiągnąć w mitchell@4GuysFromRolla.com. lub za pośrednictwem swojego blogu, który można znaleźć w http://ScottOnWriting.NET.

Specjalne podziękowania

Ta seria samouczków została sprawdzona przez wielu przydatnych recenzentów. Recenzenci liderzy dla tego samouczka to Hilton Geisenow, David suru i Teresa Murphy. Chcesz przeglądać moje nadchodzące artykuły MSDN? Jeśli tak, upuść mi linię w mitchell@4GuysFromRolla.com.