Udostępnij za pośrednictwem


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

Autor : Scott Mitchell

Pobierz plik PDF

W poprzednim samouczku dowiedzieliśmy się, jak używać Kreatora tableAdapter do generowania nowych procedur składowanych. Z tego samouczka 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 zobaczyliśmy, jak można skonfigurować klasy TableAdapters zestawu danych typed do używania procedur składowanych w celu uzyskiwania dostępu do danych, a nie do instrukcji ad hoc SQL. W szczególności zbadaliś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 istnieje prawdopodobieństwo, że baza danych zawiera już potrzebne procedury składowane. Alternatywnie możesz chcieć utworzyć procedury składowane ręcznie lub za pomocą narzędzia innego niż kreator TableAdapter, który automatycznie generuje procedury składowane.

W tym samouczku dowiesz się, jak skonfigurować metodę TableAdapter do korzystania z istniejących procedur składowanych. Ponieważ baza danych Northwind zawiera 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 (BeginTransaction, CommitTransactionitd.). Alternatywnie transakcje można zarządzać w całości w ramach procedury składowanej, która nie wymaga 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 i tak dalej — 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 procedur składowanych i dodaj nową procedurę składowaną (kliknij, aby wyświetlić obraz w pełnym rozmiarze)

Jak pokazano na rysunku 1, wybranie opcji Dodaj nową procedurę składowaną powoduje otwarcie okna skryptu w programie Visual Studio z konspektem 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 (@CategoryIDtypu int) i zwraca wszystkie pola dla tych produktów o pasującej 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 tej czynności folder Procedury składowane zostanie odświeżyny, pokazujący 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ą. Od początku skryptu zmieniono wartość na ALTER PROCEDURE, zmieniając parametry wejściowe procedur składowanych lub instrukcje SQL, a kliknięcie ikony Zapisz spowoduje zaktualizowanie procedury składowanej przy użyciu 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 w pełnym rozmiarze)

Krok 2. Konfigurowanie obiektu TableAdapter do używania 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 jej metod. W szczególności dodamy metodę do ProductsTableAdapter elementu w typowym zestawie NorthwindWithSprocs danych, który wywołuje właśnie utworzoną Products_SelectByCategoryID procedurę GetProductsByCategoryID(<_i22_>categoryID)<!--_i22_--> składowaną.

Zacznij od otwarcia zestawu NorthwindWithSprocs danych. Kliknij prawym przyciskiem myszy ProductsTableAdapter i wybierz polecenie Dodaj zapytanie, aby uruchomić kreatora konfiguracji kwerendy TableAdapter. W poprzednim samouczku postanowiliśmy utworzyć dla nas nową procedurę składowaną tableAdapter. Na potrzeby tego samouczka 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. Wybieranie opcji Użyj istniejącej procedury składowanej (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Poniższy ekran zawiera listę rozwijaną wypełniną procedurami składowanymi bazy danych. Wybranie procedury składowanej wyświetla parametry wejściowe 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 w pełnym rozmiarze)

Następny ekran pyta nas, jakiego rodzaju dane są zwracane przez procedurę składowaną, a nasza odpowiedź określa typ zwracany przez metodę TableAdapter. Jeśli na przykład wskazujemy, że zwracane są dane tabelaryczne, metoda zwróci ProductsDataTable wystąpienie wypełnione rekordami zwróconymi przez procedurę składowaną. Natomiast jeśli wskazujemy, że ta procedura składowana zwraca pojedynczą wartość, funkcja TableAdapter zwróci wartość przypisaną Object 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 w pełnym rozmiarze)

Pozostaje tylko wskazać, jakie wzorce metod mają być używane, a następnie nazwy tych metod. Pozostaw zaznaczone opcje Fill a DataTable (Wypełnianie tabeli DataTable) i Return a DataTable (Zwracanie tabeli DataTable), 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 GetProductsByCategoryIDoczekują parametru wejściowego typu Integer. 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, należy również zaktualizować parametry dla tych metod TableAdapter. Zgodnie z opisem 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 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 Function GetProductsByCategoryID(ByVal categoryID As Integer) _
    As NorthwindWithSprocs.ProductsDataTable
    Return Adapter.GetProductsByCategoryID(categoryID)
End Function

Ta metoda BLL po prostu zwraca ProductsDataTable wartość zwróconą ProductsTableAdapter z metody s GetProductsByCategoryID . Atrybut DataObjectMethodAttribute udostępnia metadane używane przez kreatora konfiguracji ź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ą i 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 kontrolka GridView wyświetli produkty należące do wybranej kategorii.

Uwaga

W poprzednich samouczkach utworzyliśmy interfejsy master/detail przy użyciu elementów DropDownLists. Aby uzyskać bardziej szczegółowe informacje na temat implementowania takiego raportu głównego/szczegółowego, zapoznaj się z samouczkiem Filtrowanie wzorca/szczegółów za pomocą listy rozwijanej.

ExistingSprocs.aspx Otwórz stronę w folderze AdvancedDAL i przeciągnij listę DropDownList z przybornika do Projektant. Dla właściwości DropDownList ID ustaw Categories właściwość i jej AutoPostBack właściwość na True. Następnie z tagu inteligentnego powiąż listę DropDownList z nową wartością 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 CategoriesBLL

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 zakończeniu pracy kreatora ObjectDataSource skonfiguruj listę DropDownList, aby wyświetlić CategoryName pole danych i użyć CategoryID pola jako Value dla każdego ListItemelementu .

W tym momencie znaczniki deklaratywne dropDownList 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 obiekt GridView na Projektant, umieszczając go pod listą DropDownList. Ustaw właściwość GridView na IDProductsByCategory i, z tagu inteligentnego, powiąż ją z nową wartością 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 Visual Basic 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 sprawdzona przez wielu pomocnych recenzentów. Recenzenci w tym samouczku byli Hilton Geisenow, S ren Jacob Lauritsen i Teresa Murphy. Chcesz przejrzeć nadchodzące artykuły MSDN? Jeśli tak, upuść mi wiersz pod adresem mitchell@4GuysFromRolla.com.