Praca z kolumnami obliczanymi (C#)
Autor : Scott Mitchell
Podczas tworzenia tabeli bazy danych firma Microsoft SQL Server umożliwia zdefiniowanie obliczonej kolumny, której wartość jest obliczana na podstawie wyrażenia, które zwykle odwołuje się do innych wartości w tym samym rekordzie bazy danych. Takie wartości są tylko do odczytu w bazie danych, co wymaga specjalnych zagadnień podczas pracy z elementami TableAdapters. Z tego samouczka dowiesz się, jak sprostać wyzwaniom związanym z obliczonymi kolumnami.
Wprowadzenie
Usługa Microsoft SQL Server umożliwia obliczanie kolumn, które są kolumnami, których wartości są obliczane na podstawie wyrażenia, które zwykle odwołuje się do wartości z innych kolumn w tej samej tabeli. Na przykład model danych śledzenia czasu może mieć tabelę o nazwie ServiceLog
z kolumnami, w tym ServicePerformed
, EmployeeID
, Rate
i Duration
, między innymi. Chociaż kwota należna na element usługi (pomnożona przez czas trwania) może być obliczana za pośrednictwem strony internetowej lub innego interfejsu programowego, może być przydatna do uwzględnienia kolumny w ServiceLog
tabeli o nazwie , AmountDue
która zgłosiła te informacje. Tę kolumnę można utworzyć jako normalną kolumnę, ale trzeba ją zaktualizować w dowolnym momencie Rate
zmiany wartości kolumny lub Duration
. Lepszym rozwiązaniem jest utworzenie AmountDue
kolumny obliczonej przy użyciu wyrażenia Rate * Duration
. W ten sposób SQL Server automatycznie obliczać AmountDue
wartość kolumny przy każdym odwołaniu w zapytaniu.
Ponieważ obliczona wartość kolumny jest określana przez wyrażenie, takie kolumny są tylko do odczytu i dlatego nie mogą mieć przypisanych do nich wartości w instrukcjach INSERT
lub UPDATE
. Jednak gdy obliczone kolumny są częścią głównego zapytania dla obiektu TableAdapter, które korzysta z instrukcji ad hoc SQL, są one automatycznie uwzględniane w automatycznie generowanych INSERT
instrukcjach i UPDATE
. W związku z tym należy zaktualizować tabelę TableAdapter oraz INSERT
kwerendy UPDATE
i InsertCommand
UpdateCommand
właściwości, aby usunąć odwołania do wszystkich kolumn obliczeniowych.
Jednym z wyzwań dotyczących używania kolumn obliczanych z tabelą TableAdapter, która używa ad hoc instrukcji SQL, jest to, że zapytania i tableAdapter s INSERT
i UPDATE
zapytania są automatycznie generowane po zakończeniu pracy kreatora konfiguracji tableAdapter. W związku z tym kolumny obliczane ręcznie usunięte z INSERT
zapytań i UPDATE
zostaną ponownie wyświetlone, jeśli kreator zostanie ponownie uruchomiony. Chociaż tableAdapters, które korzystają z procedur składowanych, nie cierpią z powodu tej kruchości, mają własne dziwactwa, które zajmiemy się w kroku 3.
W tym samouczku dodamy kolumnę obliczeniową do Suppliers
tabeli w bazie danych Northwind, a następnie utworzymy odpowiednią tabelę TableAdapter do pracy z tą tabelą i jej obliczoną kolumną. Będziemy używać procedur składowanych zamiast instrukcji AD-hoc SQL, dzięki czemu nasze dostosowania nie zostaną utracone, gdy zostanie użyty kreator konfiguracji tableAdapter.
Zacznijmy!
Krok 1. Dodawanie kolumny obliczanejSuppliers
do tabeli
Baza danych Northwind nie ma żadnych kolumn obliczeniowych, więc musimy dodać jedną kolumnę. Na potrzeby tego samouczka dodajmy do Suppliers
tabeli obliczoną kolumnę o nazwie FullContactName
, która zwraca nazwę, tytuł i firmę, dla której pracują, w następującym formacie: ContactName
(ContactTitle
, CompanyName
). Ta obliczona kolumna może być używana w raportach podczas wyświetlania informacji o dostawcach.
Zacznij od otwarcia Suppliers
definicji tabeli, klikając prawym przyciskiem myszy tabelę Suppliers
w Eksploratorze serwera i wybierając polecenie Otwórz definicję tabeli z menu kontekstowego. Spowoduje to wyświetlenie kolumn tabeli i ich właściwości, takich jak ich typ danych, czy są dozwolone NULL
itd. Aby dodać kolumnę obliczaną, zacznij od wpisania nazwy kolumny do definicji tabeli. Następnie wprowadź wyrażenie w polu tekstowym (Formuła) w sekcji Specyfikacja kolumny obliczanej w okno Właściwości kolumny (zobacz Rysunek 1). Nazwij obliczoną kolumnę FullContactName
i użyj następującego wyrażenia:
ContactName + ' (' + CASE WHEN ContactTitle IS NOT NULL THEN
ContactTitle + ', ' ELSE '' END + CompanyName + ')'
Pamiętaj, że ciągi można łączyć w języku SQL przy użyciu +
operatora . Instrukcja CASE
może być używana jak warunkowa w tradycyjnym języku programowania. W powyższym wyrażeniu instrukcję CASE
można odczytać jako: Jeśli ContactTitle
nie NULL
, wartość jest połączona ContactTitle
przecinkiem, w przeciwnym razie emituj nic. Aby uzyskać więcej informacji na temat przydatności instrukcjiCASE
, zobacz Instrukcje JĘZYKA SQLCASE
.
Uwaga
Zamiast używać instrukcji CASE
w tym miejscu, moglibyśmy też użyć metody ISNULL(ContactTitle, '')
. ISNULL(checkExpression, replacementValue)
Funkcja checkExpression zwraca wartość checkExpression , jeśli nie ma wartości NULL, w przeciwnym razie zwraca wartość replacementValue. Chociaż w tym wystąpieniu będzie działać program ISNULL
lub CASE
, istnieje bardziej skomplikowane scenariusze, w których elastyczność CASE
instrukcji nie może być dopasowana przez ISNULL
program .
Po dodaniu tej obliczonej kolumny ekran powinien wyglądać jak zrzut ekranu na rysunku 1.
Rysunek 1. Dodawanie kolumny obliczanej o nazwie FullContactName
do Suppliers
tabeli (kliknij, aby wyświetlić obraz pełnowymiarowy)
Po nazewnictwie obliczonej kolumny i wprowadzeniu wyrażenia zapisz zmiany w tabeli, klikając ikonę Zapisz na pasku narzędzi, naciskając klawisze Ctrl+S lub przechodząc do menu Plik i wybierając polecenie Zapisz Suppliers
.
Zapisanie tabeli powinno odświeżyć Eksploratora serwera, w tym właśnie dodaną kolumnę na Suppliers
liście kolumn tabeli. Ponadto wyrażenie wprowadzone w polu tekstowym (Formuła) automatycznie dostosuje się do wyrażenia równoważnego, które usuwa niepotrzebne odstępy, otacza nazwy kolumn nawiasami ([]
) i zawiera nawiasy, aby bardziej jawnie pokazać kolejność operacji:
(((([ContactName]+' (')+case when [ContactTitle] IS NOT NULL
then [ContactTitle]+', ' else '' end)+[CompanyName])+')')
Aby uzyskać więcej informacji na temat kolumn obliczanych w usłudze Microsoft SQL Server, zapoznaj się z dokumentacją techniczną. Zapoznaj się również z przewodnikiem Instrukcje: określanie kolumn obliczanych , aby zapoznać się z przewodnikiem krok po kroku tworzenia kolumn obliczeniowych.
Uwaga
Domyślnie obliczone kolumny nie są fizycznie przechowywane w tabeli, ale zamiast tego są ponownie obliczane za każdym razem, gdy są przywoływane w zapytaniu. Zaznaczając pole wyboru Jest utrwalone, można jednak poinstruować SQL Server, aby fizycznie przechowywać obliczoną kolumnę w tabeli. Dzięki temu indeks może zostać utworzony w kolumnie obliczeniowej, co może poprawić wydajność zapytań używających obliczonej wartości kolumny w swoich WHERE
klauzulach. Aby uzyskać więcej informacji, zobacz Creating Indexes on Computed Columns (Tworzenie indeksów w kolumnach obliczanych ).
Krok 2. Wyświetlanie wartości kolumn obliczeniowych
Zanim zaczniemy pracę nad warstwą dostępu do danych, poświęćmy chwilę, aby wyświetlić FullContactName
wartości. W Eksploratorze serwera kliknij prawym przyciskiem myszy Suppliers
nazwę tabeli i wybierz polecenie Nowe zapytanie z menu kontekstowego. Spowoduje to wyświetlenie okna zapytania z monitem o wybranie tabel do uwzględnienia w zapytaniu. Dodaj tabelę Suppliers
i kliknij przycisk Zamknij. Następnie sprawdź CompanyName
kolumny , ContactName
, ContactTitle
i FullContactName
z tabeli Suppliers. Na koniec kliknij ikonę czerwonego wykrzyknika na pasku narzędzi, aby wykonać zapytanie i wyświetlić wyniki.
Jak pokazano na rysunku 2, wyniki obejmują FullContactName
, który zawiera listę CompanyName
kolumn , ContactName
i ContactTitle
przy użyciu formatu ldquo;ContactName
(ContactTitle
, CompanyName
).
Rysunek 2. FullContactName
Użycie formatu ContactName
(, CompanyName
) (ContactTitle
kliknij, aby wyświetlić obraz w pełnym rozmiarze)
Krok 3. Dodawanie elementuSuppliersTableAdapter
do warstwy dostępu do danych
Aby móc pracować z informacjami o dostawcy w naszej aplikacji, musimy najpierw utworzyć tabelę TableAdapter i DataTable w naszej usłudze DAL. W idealnym przypadku można to zrobić przy użyciu tych samych prostych kroków, które zostały zbadane we wcześniejszych samouczkach. Jednak praca z kolumnami obliczanymi wprowadza kilka zmarszczek, które zasługują na dyskusję.
Jeśli używasz klasy TableAdapter korzystającej z instrukcji AD hoc SQL, możesz po prostu uwzględnić obliczoną kolumnę w głównym zapytaniu tableAdapter za pośrednictwem kreatora konfiguracji elementu TableAdapter. Spowoduje to jednak automatyczne wygenerowanie INSERT
instrukcji i UPDATE
zawierających obliczoną kolumnę. Jeśli spróbujesz wykonać jedną z tych metod, nie można zmodyfikować komunikatu Nazwakolumny kolumny, SqlException
ponieważ jest to kolumna obliczana lub wynik operatora UNION zostanie zgłoszony. Chociaż instrukcje INSERT
i UPDATE
można dostosować ręcznie za pomocą właściwości i UpdateCommand
tableAdapterInsertCommand
, te dostosowania zostaną utracone za każdym razem, gdy kreator konfiguracji narzędzia TableAdapter zostanie ponownie uruchomiony.
Ze względu na kruchość tabel TableAdapters korzystających z instrukcji AD-hoc SQL zaleca się używanie procedur składowanych podczas pracy z kolumnami obliczanymi. Jeśli używasz istniejących procedur składowanych, po prostu skonfiguruj metodę TableAdapter zgodnie z opisem w samouczku Using Existing Stored Procedures for the Typed DataSet s TableAdapters (Używanie istniejących procedur składowanych dla typed DataSet tableAdapters ). Jeśli jednak kreator tableAdapter tworzy procedury składowane, ważne jest, aby początkowo pominąć wszystkie obliczone kolumny z głównego zapytania. Jeśli do zapytania głównego dołączysz kolumnę obliczeniową, kreator konfiguracji tableAdapter poinformuje Cię po zakończeniu, że nie może utworzyć odpowiednich procedur składowanych. Krótko mówiąc, musimy najpierw skonfigurować tabelę TableAdapter przy użyciu obliczonego zapytania głównego bez kolumny, a następnie ręcznie zaktualizować odpowiednią procedurę składowaną i tabelę TableAdapter w SelectCommand
celu uwzględnienia obliczonej kolumny. To podejście jest podobne do tego, które jest używane w samouczku Aktualizowanie obiektu TableAdapter do korzystania zJOIN
programu s .
W tym samouczku dodamy nowy element TableAdapter i automatycznie utworzymy dla nas procedury składowane. W związku z tym musimy początkowo pominąć obliczoną FullContactName
kolumnę z głównego zapytania.
Rozpocznij od otwarcia elementu NorthwindWithSprocs
DataSet w folderze ~/App_Code/DAL
. Kliknij prawym przyciskiem myszy Projektant, a następnie z menu kontekstowego wybierz opcję dodania nowego elementu TableAdapter. Spowoduje to uruchomienie kreatora konfiguracji narzędzia TableAdapter. Określ bazę danych do wykonywania zapytań względem danych z (NORTHWNDConnectionString
z Web.config
) i kliknij przycisk Dalej. Ponieważ nie utworzyliśmy jeszcze żadnych procedur składowanych do wykonywania zapytań ani modyfikowania Suppliers
tabeli, wybierz opcję Utwórz nowe procedury składowane, aby kreator utworzył je dla nas, a następnie kliknij przycisk Dalej.
Rysunek 3. Wybieranie opcji Utwórz nowe procedury składowane (kliknij, aby wyświetlić obraz o pełnym rozmiarze)
W kolejnym kroku zostanie wyświetlony monit o zapytanie główne. Wprowadź następujące zapytanie, które zwraca SupplierID
kolumny , CompanyName
, ContactName
i ContactTitle
dla każdego dostawcy. Należy pamiętać, że to zapytanie celowo pomija obliczoną kolumnę (FullContactName
); zaktualizujemy odpowiednią procedurę składowaną, aby uwzględnić tę kolumnę w kroku 4.
SELECT SupplierID, CompanyName, ContactName, ContactTitle
FROM Suppliers
Po wprowadzeniu zapytania głównego i kliknięciu przycisku Dalej kreator pozwala nam na nadanie nazwy czterech procedur składowanych, które zostaną wygenerowane. Nazwij te procedury Suppliers_Select
składowane , Suppliers_Insert
, Suppliers_Update
i Suppliers_Delete
, jak pokazano na rysunku 4.
Rysunek 4. Dostosowywanie nazw automatycznie generowanych procedur składowanych (kliknij, aby wyświetlić obraz pełnowymiarowy)
Następny krok kreatora umożliwia nam nadawanie nazw metodom TableAdapter i określanie wzorców używanych do uzyskiwania dostępu do danych i ich aktualizowania. Pozostaw zaznaczone wszystkie trzy pola wyboru, ale zmień nazwę metody na GetData
GetSuppliers
. Kliknij przycisk Zakończ, aby zakończyć kreatora.
Rysunek 5. Zmiana nazwy metody na GetData
GetSuppliers
(kliknij, aby wyświetlić obraz w pełnym rozmiarze)
Po kliknięciu przycisku Zakończ kreator utworzy cztery procedury składowane i doda tabelę TableAdapter i odpowiadającą jej tabelę DataTable do typed DataSet.
Krok 4. Uwzględnianie obliczonej kolumny w głównym zapytaniu tableAdapter
Teraz musimy zaktualizować tabele TableAdapter i DataTable utworzone w kroku 3, aby uwzględnić obliczoną kolumnę FullContactName
. Obejmuje to dwa kroki:
- Aktualizowanie procedury składowanej w
Suppliers_Select
celu zwrócenia obliczonejFullContactName
kolumny i - Aktualizowanie tabeli DataTable w celu uwzględnienia odpowiedniej
FullContactName
kolumny.
Zacznij od nawigowania do Eksploratora serwera i przechodzenia do szczegółów folderu Procedury składowane. Otwórz procedurę Suppliers_Select
składowaną i zaktualizuj SELECT
zapytanie, aby uwzględnić obliczoną kolumnę FullContactName
:
SELECT SupplierID, CompanyName, ContactName, ContactTitle, FullContactName
FROM Suppliers
Zapisz zmiany w procedurze składowanej, klikając ikonę Zapisz na pasku narzędzi, naciskając klawisze Ctrl+S lub wybierając opcję Zapisz Suppliers_Select
z menu Plik.
Następnie wróć do Projektant Zestawu danych, kliknij prawym przyciskiem myszy SuppliersTableAdapter
pozycję , a następnie wybierz polecenie Konfiguruj z menu kontekstowego. Pamiętaj, że kolumna Suppliers_Select
zawiera teraz kolumnę FullContactName
w kolekcji Kolumny danych.
Rysunek 6. Uruchom Kreatora konfiguracji tabeli TableAdapter, aby zaktualizować kolumny tabeli DataTable (kliknij, aby wyświetlić obraz pełnowymiarowy)
Kliknij przycisk Zakończ, aby zakończyć kreatora. Spowoduje to automatyczne dodanie odpowiedniej kolumny do elementu SuppliersDataTable
. Kreator TableAdapter jest wystarczająco inteligentny, aby wykryć, że kolumna FullContactName
jest kolumną obliczaną i dlatego jest tylko do odczytu. W związku z tym ustawia właściwość kolumny ReadOnly
na true
wartość . Aby to sprawdzić, wybierz kolumnę z pola SuppliersDataTable
, a następnie przejdź do okno Właściwości (zobacz Rysunek 7). Należy pamiętać, że FullContactName
kolumny i DataType
MaxLength
właściwości są również ustawione odpowiednio.
Rysunek 7. Kolumna FullContactName
jest oznaczona jako Read-Only (kliknij, aby wyświetlić obraz w pełnym rozmiarze)
Krok 5. DodawanieGetSupplierBySupplierID
metody do klasy TableAdapter
Na potrzeby tego samouczka utworzymy stronę ASP.NET zawierającą dostawców w siatce z możliwością aktualizacji. W poprzednich samouczkach zaktualizowaliśmy pojedynczy rekord z warstwy logiki biznesowej przez pobranie tego konkretnego rekordu z dal jako silnie typizowanej tabeli DataTable, zaktualizowanie jej właściwości, a następnie wysłanie zaktualizowanej tabeli DataTable z powrotem do nazwy DAL w celu propagowania zmian do bazy danych. Aby wykonać ten pierwszy krok — pobranie rekordu aktualizowanego z poziomu dal — musimy najpierw dodać metodę GetSupplierBySupplierID(supplierID)
do dal.
Kliknij prawym przyciskiem myszy element SuppliersTableAdapter
w projekcie zestawu danych i wybierz opcję Dodaj zapytanie z menu kontekstowego. Podobnie jak w kroku 3, kreator wygeneruje nową procedurę składowaną, wybierając opcję Utwórz nową procedurę składowaną (zapoznaj się z rysunkiem 3, aby zapoznać się ze zrzutem ekranu tego kroku kreatora). Ponieważ ta metoda zwróci rekord z wieloma kolumnami, wskaż, że chcemy użyć zapytania SQL, które jest poleceniem SELECT, które zwraca wiersze, a następnie kliknij przycisk Dalej.
Rysunek 8. Wybieranie pozycji SELECT, która zwraca opcje wierszy (kliknij, aby wyświetlić obraz o pełnym rozmiarze)
W kolejnym kroku zostanie wyświetlony monit o użycie zapytania dla tej metody. Wprowadź następujące polecenie, które zwraca te same pola danych co główne zapytanie, ale dla określonego dostawcy.
SELECT SupplierID, CompanyName, ContactName, ContactTitle, FullContactName
FROM Suppliers
WHERE SupplierID = @SupplierID
Na następnym ekranie zostanie wyświetlony monit o nadenie nazwy procedurze składowanej, która zostanie wygenerowana automatycznie. Nadaj tej procedurze Suppliers_SelectBySupplierID
składowanej nazwę i kliknij przycisk Dalej.
Rysunek 9. Nadaj nazwę procedurze Suppliers_SelectBySupplierID
składowanej (kliknij, aby wyświetlić obraz o pełnym rozmiarze)
Na koniec kreator monituje nas o wzorce dostępu do danych i nazwy metod do użycia dla elementu TableAdapter. Pozostaw zaznaczone oba pola wyboru, ale zmień odpowiednio nazwy FillBy
metod i GetDataBy
na FillBySupplierID
i GetSupplierBySupplierID
.
Rysunek 10. Nazwij metody FillBySupplierID
TableAdapter i GetSupplierBySupplierID
(kliknij, aby wyświetlić obraz pełnowymiarowy)
Kliknij przycisk Zakończ, aby zakończyć kreatora.
Krok 6. Tworzenie warstwy logiki biznesowej
Przed utworzeniem strony ASP.NET używającej obliczonej kolumny utworzonej w kroku 1 należy najpierw dodać odpowiednie metody w usłudze BLL. Nasza strona ASP.NET, którą utworzymy w kroku 7, umożliwi użytkownikom wyświetlanie i edytowanie dostawców. W związku z tym potrzebujemy naszej BLL, aby zapewnić co najmniej metodę, aby wszyscy dostawcy i inny dostawca zaktualizowali określonego dostawcę.
Utwórz nowy plik klasy o nazwie SuppliersBLLWithSprocs
w folderze ~/App_Code/BLL
i dodaj następujący kod:
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 SuppliersBLLWithSprocs
{
private SuppliersTableAdapter _suppliersAdapter = null;
protected SuppliersTableAdapter Adapter
{
get
{
if (_suppliersAdapter == null)
_suppliersAdapter = new SuppliersTableAdapter();
return _suppliersAdapter;
}
}
[System.ComponentModel.DataObjectMethodAttribute
(System.ComponentModel.DataObjectMethodType.Select, true)]
public NorthwindWithSprocs.SuppliersDataTable GetSuppliers()
{
return Adapter.GetSuppliers();
}
[System.ComponentModel.DataObjectMethodAttribute
(System.ComponentModel.DataObjectMethodType.Update, true)]
public bool UpdateSupplier(string companyName, string contactName,
string contactTitle, int supplierID)
{
NorthwindWithSprocs.SuppliersDataTable suppliers =
Adapter.GetSupplierBySupplierID(supplierID);
if (suppliers.Count == 0)
// no matching record found, return false
return false;
NorthwindWithSprocs.SuppliersRow supplier = suppliers[0];
supplier.CompanyName = companyName;
if (contactName == null)
supplier.SetContactNameNull();
else
supplier.ContactName = contactName;
if (contactTitle == null)
supplier.SetContactTitleNull();
else
supplier.ContactTitle = contactTitle;
// Update the product record
int rowsAffected = Adapter.Update(supplier);
// Return true if precisely one row was updated, otherwise false
return rowsAffected == 1;
}
}
Podobnie jak inne klasy BLL, maAdapter
protected
właściwość, SuppliersBLLWithSprocs
która zwraca wystąpienie SuppliersTableAdapter
klasy wraz z dwiema public
metodami: GetSuppliers
i UpdateSupplier
. Metoda GetSuppliers
wywołuje metodę i zwraca wartość SuppliersDataTable
zwróconą przez odpowiednią GetSupplier
metodę w warstwie dostępu do danych. Metoda UpdateSupplier
pobiera informacje o konkretnym dostawcy aktualizowanym za pośrednictwem wywołania metody DAL GetSupplierBySupplierID(supplierID)
. Następnie aktualizuje CategoryName
właściwości , ContactName
i ContactTitle
zatwierdza te zmiany w bazie danych, wywołując metodę warstwy Update
dostępu do danych, przekazując zmodyfikowany SuppliersRow
obiekt.
Uwaga
Z wyjątkiem wartości SupplierID
i CompanyName
wszystkie kolumny w tabeli Dostawcy zezwalają na NULL
wartości. W związku z tym, jeśli przekazywane lub parametry są null
potrzebne, musimy ustawić odpowiednie ContactName
właściwości i ContactTitle
na NULL
wartość bazy danych przy użyciu SetContactNameNull
metod iSetContactTitleNull
, contactTitle
contactName
odpowiednio.
Krok 7. Praca z obliczoną kolumną z warstwy prezentacji
Po dodaniu kolumny obliczeniowej Suppliers
do tabeli oraz odpowiednio zaktualizowaniu dal i BLL możemy utworzyć stronę ASP.NET, która współpracuje z obliczoną FullContactName
kolumną. Zacznij od otwarcia ComputedColumns.aspx
strony w folderze AdvancedDAL
i przeciągnięcia kontrolki GridView z przybornika do Projektant. Ustaw właściwość GridView ID
na Suppliers
wartość i z tagu inteligentnego powiąż ją z nową wartością ObjectDataSource o nazwie SuppliersDataSource
. Skonfiguruj obiekt ObjectDataSource do używania SuppliersBLLWithSprocs
klasy, która dodano ponownie w kroku 6, a następnie kliknij przycisk Dalej.
Rysunek 11. Konfigurowanie obiektu ObjectDataSource do używania SuppliersBLLWithSprocs
klasy (kliknij, aby wyświetlić obraz w pełnym rozmiarze)
W klasie zdefiniowano SuppliersBLLWithSprocs
tylko dwie metody: GetSuppliers
i UpdateSupplier
. Upewnij się, że te dwie metody są określone odpowiednio na kartach SELECT i UPDATE, a następnie kliknij przycisk Zakończ, aby ukończyć konfigurację obiektu ObjectDataSource.
Po zakończeniu pracy kreatora konfiguracji źródła danych program Visual Studio doda pole BoundField dla każdego zwróconego pola danych. Usuń pole SupplierID
BoundField i zmień HeaderText
odpowiednio właściwości CompanyName
pól , ContactName
, ContactTitle
i FullContactName
BoundFields na Company, Contact Name, Title i Full Contact Name. W tagu inteligentnym zaznacz pole wyboru Włącz edytowanie, aby włączyć wbudowane możliwości edycji kontrolki GridView.
Oprócz dodawania obiektów BoundFields do kontrolki GridView ukończenie Kreatora źródła danych powoduje również, że program Visual Studio ustawi właściwość ObjectDataSource OldValuesParameterFormatString
na original_{0}. Przywróć to ustawienie z powrotem do wartości domyślnej. {0}
Po wprowadzeniu tych zmian w elementy GridView i ObjectDataSource ich deklaratywne znaczniki powinny wyglądać podobnie do następujących:
<asp:GridView ID="Suppliers" runat="server" AutoGenerateColumns="False"
DataKeyNames="SupplierID" DataSourceID="SuppliersDataSource">
<Columns>
<asp:CommandField ShowEditButton="True" />
<asp:BoundField DataField="CompanyName"
HeaderText="Company"
SortExpression="CompanyName" />
<asp:BoundField DataField="ContactName"
HeaderText="Contact Name"
SortExpression="ContactName" />
<asp:BoundField DataField="ContactTitle"
HeaderText="Title"
SortExpression="ContactTitle" />
<asp:BoundField DataField="FullContactName"
HeaderText="Full Contact Name"
SortExpression="FullContactName"
ReadOnly="True" />
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="SuppliersDataSource" runat="server"
SelectMethod="GetSuppliers" TypeName="SuppliersBLLWithSprocs"
UpdateMethod="UpdateSupplier">
<UpdateParameters>
<asp:Parameter Name="companyName" Type="String" />
<asp:Parameter Name="contactName" Type="String" />
<asp:Parameter Name="contactTitle" Type="String" />
<asp:Parameter Name="supplierID" Type="Int32" />
</UpdateParameters>
</asp:ObjectDataSource>
Następnie odwiedź tę stronę za pośrednictwem przeglądarki. Jak pokazano na rysunku 12, każdy dostawca jest wymieniony w siatce zawierającej FullContactName
kolumnę, której wartość jest po prostu łączeniem pozostałych trzech kolumn sformatowanych jako ContactName
(ContactTitle
, CompanyName
).
Rysunek 12. Każdy dostawca jest wymieniony w siatce (kliknij, aby wyświetlić obraz pełnowymiarowy)
Kliknięcie przycisku Edytuj dla określonego dostawcy powoduje wyświetlenie ogłaszania zwrotnego i wyświetlenie tego wiersza w interfejsie edycji (zobacz Rysunek 13). Pierwsze trzy kolumny są renderowane w domyślnym interfejsie edycji — kontrolka TextBox, której Text
właściwość jest ustawiona na wartość pola danych. Jednak kolumna FullContactName
pozostaje tekstem. Po dodaniu elementów BoundFields do kontrolki GridView po zakończeniu pracy kreatora FullContactName
konfiguracji źródła danych właściwość BoundField została ustawiona na true
, ponieważ odpowiednia FullContactName
kolumna ReadOnly
w obiekcie SuppliersDataTable
ma ustawioną ReadOnly
właściwość na true
wartość . Jak wspomniano w kroku 4, właściwość s ReadOnly
została ustawiona na true
, FullContactName
ponieważ element TableAdapter wykrył, że kolumna była kolumną obliczaną.
Rysunek 13. Kolumna FullContactName
nie jest edytowalna (kliknij, aby wyświetlić obraz w pełnym rozmiarze)
Przejdź dalej i zaktualizuj wartość co najmniej jednej edytowalnej kolumny i kliknij przycisk Aktualizuj. Zwróć uwagę, FullContactName
jak wartość s jest automatycznie aktualizowana w celu odzwierciedlenia zmiany.
Uwaga
Kontrolka GridView obecnie używa pól BoundFields dla pól edytowalnych, co powoduje domyślny interfejs edycji. CompanyName
Ponieważ pole jest wymagane, należy przekonwertować je na pole szablonu, które zawiera element RequiredFieldValidator. Zostawię to jako ćwiczenie dla zainteresowanego czytelnika. Zapoznaj się z samouczkiem Dodawanie kontrolek walidacji do samouczka Edytowanie i wstawianie interfejsów , aby uzyskać instrukcje krok po kroku dotyczące konwertowania pola powiązanego na pole szablonu i dodawania kontrolek walidacji.
Podsumowanie
Podczas definiowania schematu dla tabeli firma Microsoft SQL Server umożliwia dołączanie obliczonych kolumn. Są to kolumny, których wartości są obliczane na podstawie wyrażenia, które zwykle odwołuje się do wartości z innych kolumn w tym samym rekordzie. Ponieważ wartości kolumn obliczanych są oparte na wyrażeniu, są tylko do odczytu i nie można przypisać wartości w instrukcji INSERT
or UPDATE
. W ten sposób wprowadzono wyzwania podczas używania obliczonej kolumny w głównym zapytaniu obiektu TableAdapter, które próbuje automatycznie wygenerować odpowiednie INSERT
instrukcje , UPDATE
i DELETE
.
W tym samouczku omówiliśmy techniki obejścia wyzwań stwarzanych przez obliczone kolumny. W szczególności użyliśmy procedur składowanych w tabeli TableAdapter, aby przezwyciężyć kruchość związaną z metodami TableAdapters, które używają instrukcji ad hoc JĘZYKA SQL. Jeśli kreator TableAdapter tworzy nowe procedury składowane, ważne jest, aby główne zapytanie początkowo pomijało wszystkie obliczone kolumny, ponieważ ich obecność uniemożliwia generowanie procedur składowanych modyfikacji danych. Po początkowym skonfigurowaniu obiektu TableAdapter można ponownie skonfigurować jego SelectCommand
procedurę składowaną w celu uwzględnienia dowolnych kolumn obliczeniowych.
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 i Teresa Murphy. Chcesz przejrzeć nadchodzące artykuły MSDN? Jeśli tak, upuść mi wiersz pod adresemmitchell@4GuysFromRolla.com .
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla