Korzystanie z istniejących procedur składowanych dla elementów TableAdapter typizowanego zestawu danych (C#)

Autor: Scott Mitchell

Pobierz plik PDF

W poprzednim samouczku dowiedzieliśmy się, jak za pomocą Kreatora tableAdapter wygenerować nowe procedury składowane. W tym samouczku dowiesz się, jak ten sam Kreator tableAdapter może pracować z istniejącymi procedurami składowanymi. Dowiesz się również, jak ręcznie dodać nowe procedury składowane do naszej bazy danych.

Wprowadzenie

W poprzednim samouczku pokazano, jak można skonfigurować klasy TableAdapters typed DataSet do używania procedur składowanych w celu uzyskania dostępu do danych, a nie instrukcji ad hoc SQL. W szczególności sprawdziliśmy, jak kreator TableAdapter automatycznie tworzy te procedury składowane. Podczas przenoszenia starszej aplikacji do ASP.NET 2.0 lub podczas tworzenia witryny internetowej ASP.NET 2.0 wokół istniejącego modelu danych prawdopodobieństwo, że baza danych zawiera już potrzebne procedury składowane. Alternatywnie możesz wolisz utworzyć procedury składowane ręcznie lub za pomocą innego narzędzia niż kreator TableAdapter, który automatycznie generuje procedury składowane.

W tym samouczku przyjrzymy się, jak skonfigurować narzędzie TableAdapter do korzystania z istniejących procedur składowanych. Ponieważ baza danych Northwind ma tylko niewielki zestaw wbudowanych procedur składowanych, przyjrzymy się również krokom wymaganym do ręcznego dodawania nowych procedur składowanych do bazy danych za pośrednictwem środowiska programu Visual Studio. Zacznijmy!

Uwaga

W samouczku opakowującym modyfikacje bazy danych w ramach transakcji dodaliśmy metody do klasy TableAdapter w celu obsługi transakcji (BeginTransactionitd CommitTransaction.). Alternatywnie transakcje mogą być zarządzane całkowicie w ramach procedury składowanej, która nie wymaga żadnych modyfikacji kodu warstwy dostępu do danych. W tym samouczku zapoznamy się z poleceniami języka T-SQL używanymi do wykonywania instrukcji procedury składowanej w zakresie transakcji.

Krok 1. Dodawanie procedur składowanych do bazy danych Northwind

Program Visual Studio ułatwia dodawanie nowych procedur składowanych do bazy danych. Dodajmy nową procedurę składowaną do bazy danych Northwind, która zwraca wszystkie kolumny z Products tabeli dla tych, które mają określoną CategoryID wartość. W oknie Eksplorator serwera rozwiń bazę danych Northwind, aby jej foldery — Diagramy bazy danych, tabele, widoki itd. — są wyświetlane. Jak pokazano w poprzednim samouczku, folder Procedury składowane zawiera istniejące procedury składowane bazy danych. Aby dodać nową procedurę składowaną, po prostu kliknij prawym przyciskiem myszy folder Procedury składowane i wybierz opcję Dodaj nową procedurę składowaną z menu kontekstowego.

Kliknij prawym przyciskiem myszy folder Procedury składowane i dodaj nową procedurę składowaną

Rysunek 1. Right-Click folder Procedury składowane i Dodaj nową procedurę składowaną (kliknij, aby wyświetlić obraz pełnowymiarowy)

Jak pokazano na rysunku 1, wybranie opcji Dodaj nową procedurę składowaną powoduje otwarcie okna skryptu w programie Visual Studio z konturem skryptu SQL potrzebnego do utworzenia procedury składowanej. Naszym zadaniem jest ułomienie tego skryptu i wykonanie go, w którym momencie procedura składowana zostanie dodana do bazy danych.

Wprowadź następujący skrypt:

CREATE PROCEDURE dbo.Products_SelectByCategoryID 
(
    @CategoryID int
)
AS
SELECT ProductID, ProductName, SupplierID, CategoryID, 
       QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, 
       ReorderLevel, Discontinued
FROM Products
WHERE CategoryID = @CategoryID

Ten skrypt, po wykonaniu, doda nową procedurę składowaną do bazy danych Northwind o nazwie Products_SelectByCategoryID. Ta procedura składowana akceptuje pojedynczy parametr wejściowy (@CategoryIDtyp int) i zwraca wszystkie pola dla tych produktów z pasującą CategoryID wartością.

Aby wykonać ten CREATE PROCEDURE skrypt i dodać procedurę składowaną do bazy danych, kliknij ikonę Zapisz na pasku narzędzi lub naciśnij klawisze Ctrl+S. Po wykonaniu tego czynności folder Procedury składowane zostanie odświeżyny z nowo utworzoną procedurą składowaną. Ponadto skrypt w oknie zmieni subtelność z CREATE PROCEDURE dbo.Products_SelectProductByCategoryID na ALTER PROCEDUREdbo.Products_SelectProductByCategoryID. CREATE PROCEDURE Dodaje nową procedurę składowaną do bazy danych, a jednocześnie ALTER PROCEDURE aktualizuje istniejącą. Ponieważ początek skryptu został zmieniony na ALTER PROCEDURE, zmiana parametrów wejściowych procedur składowanych lub instrukcji SQL i kliknięcie ikony Zapisz spowoduje zaktualizowanie procedury składowanej za pomocą tych zmian.

Rysunek 2 przedstawia program Visual Studio po zapisaniu Products_SelectByCategoryID procedury składowanej.

Procedura składowana Products_SelectByCategoryID została dodana do bazy danych

Rysunek 2. Procedura Products_SelectByCategoryID składowana została dodana do bazy danych (kliknij, aby wyświetlić obraz pełnowymiarowy)

Krok 2. Konfigurowanie narzędzia TableAdapter do korzystania z istniejącej procedury składowanej

Teraz, gdy Products_SelectByCategoryID procedura składowana została dodana do bazy danych, możemy skonfigurować warstwę dostępu do danych tak, aby korzystała z tej procedury składowanej po wywołaniu jednej z jego metod. W szczególności dodamy metodę do ProductsTableAdapter elementu w typowym zestawie NorthwindWithSprocs danych, który wywołuje właśnie utworzoną GetProductsByCategoryID(categoryID) procedurę Products_SelectByCategoryID składowaną.

Zacznij od otwarcia zestawu NorthwindWithSprocs danych. Kliknij prawym przyciskiem myszy polecenie ProductsTableAdapter i wybierz polecenie Dodaj zapytanie, aby uruchomić kreatora konfiguracji zapytań TableAdapter. W poprzednim samouczku postanowiliśmy utworzyć dla nas nową procedurę składowaną tableAdapter. W tym samouczku chcemy jednak połączyć nową metodę TableAdapter z istniejącą Products_SelectByCategoryID procedurą składowaną. W związku z tym wybierz opcję Użyj istniejącej procedury składowanej w pierwszym kroku kreatora, a następnie kliknij przycisk Dalej.

Wybierz opcję Użyj istniejącej procedury składowanej

Rysunek 3. Wybierz opcję Użyj istniejącej procedury składowanej (kliknij, aby wyświetlić obraz pełnowymiarowy)

Poniższy ekran zawiera listę rozwijaną wypełniną procedurami składowanymi bazy danych. Wybranie procedury składowanej zawiera listę parametrów wejściowych po lewej stronie, a pola danych zwrócone (jeśli istnieją) po prawej stronie. Wybierz procedurę Products_SelectByCategoryID składowaną z listy i kliknij przycisk Dalej.

Wybierz procedurę składowaną Products_SelectByCategoryID

Rysunek 4. Wybierz procedurę Products_SelectByCategoryID składowaną (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Następny ekran pyta nas, jakiego rodzaju dane są zwracane przez procedurę składowaną, a nasza odpowiedź tutaj określa typ zwracany przez metodę TableAdapter. Jeśli na przykład wskazujemy, że zwracane są dane tabelaryczne, metoda zwróci wystąpienie wypełnione rekordami zwróconymi przez procedurę ProductsDataTable składowaną. Jeśli natomiast wskazujemy, że ta procedura składowana zwraca pojedynczą wartość, metoda TableAdapter zwróci object wartość przypisaną w pierwszej kolumnie pierwszego rekordu zwróconego przez procedurę składowaną.

Products_SelectByCategoryID Ponieważ procedura składowana zwraca wszystkie produkty należące do określonej kategorii, wybierz pierwszą odpowiedź — dane tabelaryczne — i kliknij przycisk Dalej.

Wskazuje, że procedura składowana zwraca dane tabelaryczne

Rysunek 5. Wskazuje, że procedura składowana zwraca dane tabelaryczne (kliknij, aby wyświetlić obraz pełnowymiarowy)

Pozostaje wskazać, jakie wzorce metod mają być używane, a następnie nazwy tych metod. Pozostaw zaznaczone opcje Fill a DataTable (Wypełnij tabelę danych) i Return a DataTable (Zwracanie tabeli danych), ale zmień nazwy metod na FillByCategoryID i GetProductsByCategoryID. Następnie kliknij przycisk Dalej, aby przejrzeć podsumowanie zadań wykonywanych przez kreatora. Jeśli wszystko wygląda poprawnie, kliknij przycisk Zakończ.

Nazwij metody FillByCategoryID i GetProductsByCategoryID

Rysunek 6. Nadaj metodom FillByCategoryID nazwę i GetProductsByCategoryID (kliknij, aby wyświetlić obraz pełnowymiarowy)

Uwaga

Właśnie utworzone FillByCategoryID metody TableAdapter i GetProductsByCategoryID, oczekują parametru wejściowego typu int. Ta wartość parametru wejściowego jest przekazywana do procedury składowanej za pośrednictwem jego @CategoryID parametru. Jeśli zmodyfikujesz Products_SelectByCategory parametry procedury składowanej, musisz również zaktualizować parametry dla tych metod TableAdapter. Jak wspomniano w poprzednim samouczku, można to zrobić na jeden z dwóch sposobów: ręcznie dodając lub usuwając parametry z kolekcji parametrów lub ponownie uruchamiając kreatora TableAdapter.

Krok 3. DodawanieGetProductsByCategoryID(categoryID)metody do usługi BLL

Po zakończeniu GetProductsByCategoryID metody DAL następnym krokiem jest zapewnienie dostępu do tej metody w warstwie logiki biznesowej. ProductsBLLWithSprocs Otwórz plik klasy i dodaj następującą metodę:

[System.ComponentModel.DataObjectMethodAttribute
    (System.ComponentModel.DataObjectMethodType.Select, false)]
public NorthwindWithSprocs.ProductsDataTable GetProductByCategoryID(int categoryID)
{
    return Adapter.GetProductsByCategoryID(categoryID);
}

Ta metoda BLL po prostu zwraca zwrócone ProductsDataTable z ProductsTableAdapter metody s GetProductsByCategoryID . Atrybut DataObjectMethodAttribute udostępnia metadane używane przez Kreatora konfigurowania źródła danych objectDataSource. W szczególności ta metoda zostanie wyświetlona na liście rozwijanej kart SELECT.

Krok 4. Wyświetlanie produktów według kategorii

Aby przetestować nowo dodaną Products_SelectByCategoryID procedurę składowaną oraz odpowiednie metody DAL i BLL, utwórzmy stronę ASP.NET zawierającą listę DropDownList i GridView. Lista rozwijana będzie zawierać listę wszystkich kategorii w bazie danych, podczas gdy element GridView wyświetli produkty należące do wybranej kategorii.

Uwaga

W poprzednich samouczkach utworzyliśmy interfejsy wzorca/szczegółów przy użyciu list DropDownList. Aby uzyskać bardziej szczegółowe informacje na temat implementowania takiego raportu wzorca/szczegółów, zapoznaj się z samouczkiem Master/Detail Filtering With a DropDownList (Filtrowanie wzorca/szczegółów za pomocą listy rozwijanej DropDownList ).

ExistingSprocs.aspx Otwórz stronę w folderze AdvancedDAL i przeciągnij listę DropDownList z przybornika na Projektant. Ustaw właściwość DropDownList ID na Categories i jej AutoPostBack właściwość na true. Następnie z tagu inteligentnego powiąż listę DropDownList z nowym obiektem ObjectDataSource o nazwie CategoriesDataSource. Skonfiguruj obiekt ObjectDataSource, aby pobierał dane z CategoriesBLL metody klasy .GetCategories Ustaw listy rozwijane na kartach UPDATE, INSERT i DELETE na wartość (Brak).

Pobieranie danych z metody GetCategories klasy CategoryBLL

Rysunek 7. Pobieranie danych z CategoriesBLL metody klasy GetCategories (kliknij, aby wyświetlić obraz pełnowymiarowy)

Ustaw Drop-Down Listy na kartach UPDATE, INSERT i DELETE na wartość (Brak)

Rysunek 8. Ustawianie Drop-Down Listy na kartach UPDATE, INSERT i DELETE na wartość (Brak) (Kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Po ukończeniu pracy kreatora ObjectDataSource skonfiguruj listę rozwijaną , aby wyświetlić CategoryName pole danych i użyć CategoryID pola jako Value pola dla każdego ListItemelementu .

Na tym etapie znaczniki deklaratywne listy rozwijanej i objectDataSource powinny wyglądać podobnie do następujących:

<asp:DropDownList ID="Categories" runat="server" AutoPostBack="True" 
    DataSourceID="CategoriesDataSource" DataTextField="CategoryName" 
    DataValueField="CategoryID">
</asp:DropDownList>
<asp:ObjectDataSource ID="CategoriesDataSource" runat="server"
    OldValuesParameterFormatString="original_{0}" 
    SelectMethod="GetCategories" TypeName="CategoriesBLL">
</asp:ObjectDataSource>

Następnie przeciągnij element GridView na Projektant, umieszczając go pod listą DropDownList. Ustaw element GridView na IDProductsByCategory wartość i z tagu inteligentnego powiąż go z nowym obiektem ObjectDataSource o nazwie ProductsByCategoryDataSource. Skonfiguruj obiekt ProductsByCategoryDataSource ObjectDataSource do użycia ProductsBLLWithSprocs klasy, pobierając dane przy użyciu GetProductsByCategoryID(categoryID) metody . Ponieważ ten element GridView będzie używany tylko do wyświetlania danych, ustaw listy rozwijane na kartach UPDATE, INSERT i DELETE na wartość (Brak), a następnie kliknij przycisk Dalej.

Konfigurowanie obiektu ObjectDataSource do używania klasy ProductsBLLWithSprocs

Rysunek 9. Konfigurowanie obiektu ObjectDataSource do używania ProductsBLLWithSprocs klasy (kliknij, aby wyświetlić obraz pełnowymiarowy)

Pobieranie danych z metody GetProductsByCategoryID(categoryID)

Rysunek 10. Pobieranie danych z GetProductsByCategoryID(categoryID) metody (kliknij, aby wyświetlić obraz pełnowymiarowy)

Metoda wybrana na karcie SELECT oczekuje parametru, więc ostatni krok kreatora monituje nas o źródło parametru. Ustaw listę rozwijaną Źródło parametrów na Kontrolkę i wybierz kontrolkę Categories z listy rozwijanej ControlID. Kliknij przycisk Zakończ, aby zakończyć kreatora.

Użyj listy rozwijanej Kategorie jako źródła parametru categoryID

Rysunek 11. Użyj listy Categories rozwijanej jako źródła parametru categoryID (kliknij, aby wyświetlić obraz pełnowymiarowy)

Po ukończeniu pracy kreatora ObjectDataSource program Visual Studio doda pola BoundFields i pole CheckBoxField dla każdego pola danych produktu. Możesz dostosować te pola zgodnie z potrzebami.

Odwiedź stronę za pośrednictwem przeglądarki. Podczas odwiedzania strony wybrano kategorię Napoje i odpowiednie produkty wymienione w siatce. Zmiana listy rozwijanej na alternatywną kategorię, jak pokazano na rysunku 12, powoduje powrót i ponowne załadowanie siatki z produktami nowo wybranej kategorii.

Wyświetlane są produkty w kategorii Produkcji

Rysunek 12. Wyświetlane są produkty w kategorii produkcji (kliknij, aby wyświetlić obraz pełnowymiarowy)

Krok 5. Zawijanie instrukcji procedury składowanej w zakresie transakcji

W samouczku opakowującym modyfikacje bazy danych w ramach transakcji omówiliśmy techniki wykonywania serii instrukcji modyfikacji bazy danych w zakresie transakcji. Pamiętaj, że modyfikacje wykonywane pod parasolem transakcji albo wszystkie powodzenie, czy wszystkie niepowodzenia, gwarantując niepodzielność. Techniki używania transakcji obejmują:

  • Używanie klas w System.Transactions przestrzeni nazw
  • Warstwa dostępu do danych używa klas ADO.NET, takich jak SqlTransaction, i
  • Dodawanie poleceń transakcji języka T-SQL bezpośrednio w procedurze składowanej

Samouczek opakowujące modyfikacje bazy danych w ramach transakcji używał klas ADO.NET w usłudze DAL. W pozostałej części tego samouczka przedstawiono sposób zarządzania transakcją przy użyciu poleceń języka T-SQL z poziomu procedury składowanej.

Trzy kluczowe polecenia SQL do ręcznego uruchamiania, zatwierdzania i wycofywania transakcji to BEGIN TRANSACTION, COMMIT TRANSACTIONi ROLLBACK TRANSACTION, odpowiednio. Podobnie jak w przypadku podejścia ADO.NET, w przypadku korzystania z transakcji z procedury składowanej musimy zastosować następujący wzorzec:

  1. Wskazuje początek transakcji.
  2. Wykonaj instrukcje SQL, które składają się na transakcję.
  3. Jeśli w jednej z instrukcji z kroku 2 wystąpi błąd, wycofaj transakcję
  4. Jeśli wszystkie instrukcje z kroku 2 zakończą się bez błędu, zatwierdź transakcję.

Ten wzorzec można zaimplementować w składni języka T-SQL przy użyciu następującego szablonu:

BEGIN TRY
  BEGIN TRANSACTION -- Start the transaction
  ... Perform the SQL statements that makeup the transaction ...
  -- If we reach here, success!
  COMMIT TRANSACTION
END TRY
BEGIN CATCH 
  -- Whoops, there was an error
  ROLLBACK TRANSACTION
  -- Raise an error with the 
  -- details of the exception   
  DECLARE @ErrMsg nvarchar(4000),
          @ErrSeverity int 
  SELECT @ErrMsg = ERROR_MESSAGE(), 
         @ErrSeverity = ERROR_SEVERITY() 
 
  RAISERROR(@ErrMsg, @ErrSeverity, 1) 
END CATCH

Szablon rozpoczyna się od zdefiniowania TRY...CATCH bloku, konstrukcji nowej do SQL Server 2005 roku. Podobnie jak w przypadku try...catch bloków w języku C#, blok SQL TRY...CATCH wykonuje instrukcje w TRY bloku. Jeśli jakakolwiek instrukcja zgłasza błąd, kontrolka zostanie natychmiast przeniesiona do CATCH bloku.

Jeśli nie ma żadnych błędów podczas wykonywania instrukcji SQL, które makijażu transakcji, COMMIT TRANSACTION instrukcja zatwierdza zmiany i kończy transakcję. Jeśli jednak jedna z instrukcji powoduje błąd, ROLLBACK TRANSACTION blok w CATCH bloku zwraca bazę danych do stanu przed rozpoczęciem transakcji. Procedura składowana zgłasza również błąd przy użyciu polecenia RAISERROR, co powoduje, że element SqlException zostanie zgłoszony w aplikacji.

Uwaga

TRY...CATCH Ponieważ blok jest nowy do SQL Server 2005 r., powyższy szablon nie będzie działać, jeśli używasz starszych wersji usługi Microsoft SQL Server.

Przyjrzyjmy się konkretnego przykładu. Ograniczenie klucza obcego istnieje między tabelami Categories i Products , co oznacza, że każde CategoryID pole w Products tabeli musi mapować na CategoryID wartość w Categories tabeli. Wszelkie działania, które naruszają to ograniczenie, takie jak próba usunięcia kategorii, która ma skojarzone produkty, powoduje naruszenie ograniczenia klucza obcego. Aby to sprawdzić, przejdź ponownie do przykładu Aktualizowanie i usuwanie istniejących danych binarnych w sekcji Praca z danymi binarnymi (~/BinaryData/UpdatingAndDeleting.aspx). Ta strona zawiera listę każdej kategorii w systemie wraz z przyciskami Edytuj i Usuń (zobacz Rysunek 13), ale jeśli próbujesz usunąć kategorię, która ma skojarzone produkty — takie jak Napoje — usuwanie kończy się niepowodzeniem z powodu naruszenia ograniczeń klucza obcego (patrz Rysunek 14).

Każda kategoria jest wyświetlana w elemecie GridView z przyciskami edycji i usuwania

Rysunek 13. Każda kategoria jest wyświetlana w widoku GridView z przyciskami edycji i usuwania (kliknij, aby wyświetlić obraz pełnowymiarowy)

Nie można usunąć kategorii z istniejącymi produktami

Rysunek 14. Nie można usunąć kategorii z istniejącymi produktami (kliknij, aby wyświetlić obraz pełnowymiarowy)

Załóżmy jednak, że chcemy zezwolić na usunięcie kategorii niezależnie od tego, czy mają skojarzone produkty. Jeśli kategoria z produktami zostanie usunięta, wyobraź sobie, że chcemy również usunąć swoje istniejące produkty (chociaż inną opcją byłoby po prostu ustawienie jego wartości produktów CategoryID na NULLwartość ). Tę funkcję można zaimplementować za pomocą kaskadowych reguł ograniczenia klucza obcego. Alternatywnie możemy utworzyć procedurę składowaną @CategoryID , która akceptuje parametr wejściowy, a po wywołaniu jawnie usuwa wszystkie skojarzone produkty, a następnie określoną kategorię.

Nasza pierwsza próba przeprowadzenia takiej procedury składowanej może wyglądać następująco:

CREATE PROCEDURE dbo.Categories_Delete
(
    @CategoryID int
)
AS
-- First, delete the associated products...
DELETE FROM Products
WHERE CategoryID = @CategoryID
-- Now delete the category
DELETE FROM Categories
WHERE CategoryID = @CategoryID

Chociaż na pewno usunie to skojarzone produkty i kategorię, nie robi to pod parasolem transakcji. Wyobraź sobie, że istnieje inne ograniczenie Categories klucza obcego, które uniemożliwiłoby usunięcie określonej @CategoryID wartości. Problem polega na tym, że w takim przypadku wszystkie produkty zostaną usunięte przed podjęciem próby usunięcia kategorii. Wynikiem netto jest to, że w przypadku takiej kategorii ta procedura składowana usunie wszystkie swoje produkty, podczas gdy kategoria pozostała, ponieważ nadal ma powiązane rekordy w innej tabeli.

Jeśli procedura składowana została opakowana w zakresie transakcji, jednak usunięcia do Products tabeli zostaną wycofane w obliczu nieudanego usunięcia w systemie Categories. Następujący skrypt procedury składowanej używa transakcji w celu zapewnienia niepodzielności między dwiema DELETE instrukcjami:

CREATE PROCEDURE dbo.Categories_Delete
(
    @CategoryID int
)
AS
BEGIN TRY
  BEGIN TRANSACTION -- Start the transaction
  -- First, delete the associated products...
  DELETE FROM Products
  WHERE CategoryID = @CategoryID
  -- Now delete the category
  DELETE FROM Categories
  WHERE CategoryID = @CategoryID
  -- If we reach here, success!
  COMMIT TRANSACTION
END TRY
BEGIN CATCH 
  -- Whoops, there was an error
  ROLLBACK TRANSACTION
  -- Raise an error with the 
  -- details of the exception   
  DECLARE @ErrMsg nvarchar(4000),
          @ErrSeverity int 
  SELECT @ErrMsg = ERROR_MESSAGE(), 
         @ErrSeverity = ERROR_SEVERITY() 
 
  RAISERROR(@ErrMsg, @ErrSeverity, 1) 
END CATCH

Poświęć chwilę, aby dodać procedurę Categories_Delete składowaną do bazy danych Northwind. Zapoznaj się z krokiem 1, aby uzyskać instrukcje dotyczące dodawania procedur składowanych do bazy danych.

Krok 6. Aktualizowanie elementuCategoriesTableAdapter

Mimo że dodaliśmy procedurę Categories_Delete składowaną do bazy danych, usługa DAL jest obecnie skonfigurowana do używania instrukcji AD-hoc SQL do wykonania usunięcia. Musimy zaktualizować element CategoriesTableAdapter i poinstruować go, aby zamiast tego korzystała z Categories_Delete procedury składowanej.

Uwaga

Wcześniej w tym samouczku pracowaliśmy z zestawem NorthwindWithSprocs danych. Jednak ten zestaw danych ma tylko jedną jednostkę , ProductsDataTablei musimy pracować z kategoriami. W związku z tym w pozostałej części tego samouczka, kiedy mówię o warstwie dostępu do danych, którą odwołujem się do Northwind zestawu danych, czyli tego, który został utworzony po raz pierwszy w samouczku Tworzenie warstwy dostępu do danych .

Otwórz element Northwind DataSet, wybierz CategoriesTableAdapterelement i przejdź do okno Właściwości. Okno Właściwości zawiera listę InsertCommand, , UpdateCommandDeleteCommandi SelectCommand używanych przez tableAdapter, a także jego nazwę i informacje o połączeniu. Rozwiń właściwość, DeleteCommand aby wyświetlić jej szczegóły. Jak pokazano na rysunku CommandText 15, DeleteCommand właściwość s CommandType jest ustawiona na Tekst, co powoduje wysłanie tekstu we właściwości jako zapytanie ad hoc SQL.

Wybierz tabelę CategoriesTableAdapter w Projektant, aby wyświetlić jej właściwości w oknie Właściwości

Rysunek 15. Wybierz CategoriesTableAdapter element w Projektant, aby wyświetlić jego właściwości w oknie Właściwości

Aby zmienić te ustawienia, wybierz tekst (DeleteCommand) w okno Właściwości i wybierz pozycję (Nowy) z listy rozwijanej. Spowoduje to wyczyszczenie ustawień właściwości CommandText, CommandTypei Parameters . Następnie ustaw CommandType właściwość na StoredProcedure , a następnie wpisz nazwę procedury składowanej (CommandTextdbo.Categories_Delete). Jeśli upewnij się, że wprowadzisz właściwości w tej kolejności — najpierw polecenie CommandType , a następnie CommandText — Program Visual Studio automatycznie wypełni kolekcję Parametry. Jeśli nie wprowadzisz tych właściwości w tej kolejności, musisz ręcznie dodać parametry za pomocą kolekcji parametrów Redaktor. W obu przypadkach rozważne jest kliknięcie wielokropka we właściwości Parameters w celu wyświetlenia kolekcji parametrów Redaktor w celu sprawdzenia, czy wprowadzono prawidłowe zmiany ustawień parametrów (patrz Rysunek 16). Jeśli w oknie dialogowym nie widzisz żadnych parametrów, dodaj @CategoryID parametr ręcznie (nie musisz dodawać parametru @RETURN_VALUE ).

Upewnij się, że ustawienia parametrów są poprawne

Rysunek 16. Upewnij się, że ustawienia parametrów są poprawne

Po zaktualizowaniu dal usunięcie kategorii spowoduje automatyczne usunięcie wszystkich skojarzonych produktów i zrobienie tego pod parasolem transakcji. Aby to sprawdzić, wróć do strony Aktualizowanie i usuwanie istniejących danych binarnych, a następnie kliknij przycisk Usuń dla jednej z kategorii. Po jednym kliknięciu myszy kategoria i wszystkie skojarzone z nią produkty zostaną usunięte.

Uwaga

Przed przetestowaniem Categories_Delete procedury składowanej, która usunie wiele produktów wraz z wybraną kategorią, warto utworzyć kopię zapasową bazy danych. Jeśli używasz NORTHWND.MDF bazy danych w programie App_Data, po prostu zamknij program Visual Studio i skopiuj pliki MDF i LDF do App_Data innego folderu. Po przetestowaniu funkcji można przywrócić bazę danych, zamykając program Visual Studio i zastępując bieżące pliki MDF i LDF w kopiach App_Data zapasowych.

Podsumowanie

Podczas gdy kreator TableAdapter automatycznie wygeneruje procedury składowane dla nas, istnieją czasy, w których możemy już utworzyć takie procedury składowane lub chcieć je utworzyć ręcznie lub za pomocą innych narzędzi. Aby obsłużyć takie scenariusze, można również skonfigurować metodę TableAdapter tak, aby wskazywała istniejącą procedurę składowaną. W tym samouczku przedstawiono sposób ręcznego dodawania procedur składowanych do bazy danych za pośrednictwem środowiska programu Visual Studio oraz sposobu podłącznia metod TableAdapter do tych procedur składowanych. Zbadaliśmy również polecenia języka T-SQL i wzorzec skryptu używane do uruchamiania, zatwierdzania i wycofywania transakcji z poziomu procedury składowanej.

Szczęśliwe programowanie!

Informacje o autorze

Scott Mitchell, autor siedmiu książek ASP/ASP.NET i założyciel 4GuysFromRolla.com, współpracuje z technologiami internetowymi firmy Microsoft od 1998 roku. Scott pracuje jako niezależny konsultant, trener i pisarz. Jego najnowsza książka to Sams Teach Yourself ASP.NET 2.0 w ciągu 24 godzin. Można do niego dotrzeć pod adresem mitchell@4GuysFromRolla.com. Lub za pośrednictwem swojego bloga, który można znaleźć na stronie http://ScottOnWriting.NET.

Specjalne podziękowania

Ta seria samouczków została przejrzyona przez wielu przydatnych recenzentów. Głównymi recenzentami tego samouczka byli Hilton Geisenow, S ren Jacob Lauritsen i Teresa Murphy. Chcesz przejrzeć nadchodzące artykuły MSDN? Jeśli tak, upuść mi wiersz pod adresemmitchell@4GuysFromRolla.com .