計算列を使用する (C#)

作成者: Scott Mitchell

PDF のダウンロード

Microsoft SQL Serverでは、データベース テーブルを作成するときに、通常は同じデータベース レコード内の他の値を参照する式から値を計算する計算列を定義できます。 このような値はデータベースでは読み取り専用であり、TableAdapters を使用する場合は特別な考慮事項が必要です。 このチュートリアルでは、計算列によってもたらされる課題を満たす方法について説明します。

はじめに

Microsoft SQL Serverでは、計算列を使用できます。これは、通常、同じテーブル内の他の列の値を参照する式から値が計算される列です。 たとえば、時間追跡データ モデルには、、 RateEmployeeIDDurationなどの列を含む ServicePerformedという名前ServiceLogのテーブルが含まれる場合があります。 サービス項目ごとの支払額 (レートに期間を掛けた金額) は、Web ページまたはその他のプログラム インターフェイスを使用して計算できますが、この情報を報告した という名前AmountDueの列をServiceLogテーブルに含めるのが便利な場合があります。 この列は通常の列として作成できますが、 または Duration 列の値が変更された場合は常に更新するRate必要があります。 より良い方法は、 式 Rate * DurationAmountDue使用して列を計算列にすることです。 これにより、クエリで列値が参照されるたびに、SQL Serverによって列の値が自動的に計算AmountDueされます。

計算列の値は式によって決定されるため、このような列は読み取り専用であるため、または UPDATE ステートメントでINSERT値を割り当てることはできません。 ただし、計算列がアドホック SQL ステートメントを使用する TableAdapter のメイン クエリの一部である場合は、自動生成された INSERT ステートメントと UPDATE ステートメントに自動的に含まれます。 したがって、TableAdapter と INSERTUPDATE クエリ、および InsertCommandUpdateCommand プロパティを更新して、計算列への参照を削除する必要があります。

アドホック SQL ステートメントを使用する TableAdapter で計算列を使用する場合の課題の 1 つは、TableAdapter 構成ウィザードが完了するたびに TableAdapter とINSERTUPDATEクエリが自動的に再生成されるということです。 したがって、 から手動で削除された INSERT 計算列と UPDATE クエリは、ウィザードを再実行すると再び表示されます。 ストアド プロシージャを使用する TableAdapter は、この脆弱性に悩まされることはありませんが、手順 3 で対処する独自の違いがあります。

このチュートリアルでは、Northwind データベースのテーブルに計算列を Suppliers 追加し、対応する TableAdapter を作成して、このテーブルとその計算列を操作します。 TableAdapter 構成ウィザードを使用するときにカスタマイズが失われないよう、アドホック SQL ステートメントではなく TableAdapter でストアド プロシージャを使用します。

始めましょう。

手順 1: 計算列をテーブルに追加するSuppliers

Northwind データベースには計算列がないため、自分で列を追加する必要があります。 このチュートリアルでは、 という名前のテーブルに計算列をSuppliers追加し、連絡先の名前、タイトル、および勤務先の会社を次の形式で返します。 ContactNameContactTitleCompanyNameFullContactName この計算列は、仕入先に関する情報を表示するときにレポートで使用される場合があります。

まず、Suppliersサーバー エクスプローラーでテーブルをSuppliers右クリックし、コンテキスト メニューから [テーブル定義を開く] を選択して、テーブル定義を開きます。 これにより、テーブルの列とそのプロパティ (データ型、許可 NULL されているかどうかなど) が表示されます。 計算列を追加するには、まず列の名前をテーブル定義に入力します。 次に、[列] プロパティ ウィンドウの [計算列の指定] セクションの下の [式] ボックスにその式を入力します (図 1 を参照)。 計算列 FullContactName に名前を付け、次の式を使用します。

ContactName + ' (' + CASE WHEN ContactTitle IS NOT NULL THEN 
    ContactTitle + ', ' ELSE '' END + CompanyName + ')'

SQL では、 演算子を使用して文字列を連結できることに + 注意してください。 ステートメントは CASE 、従来のプログラミング言語の条件付きのように使用できます。 上記の式では、 ステートメントを CASE 次のように読み取ることができます。 が でない場合ContactTitleは、コンマで連結された値がContactTitle出力され、それ以外の場合は何も出力されませんNULL。 ステートメントの有用性の CASE 詳細については、「 SQL CASE ステートメント」を参照してください。

注意

ここで ステートメントを使用する CASE 代わりに、 を使用 ISNULL(ContactTitle, '')することもできます。 ISNULL(checkExpression, replacementValue) null 以外の場合は checkExpression を返し、それ以外の場合は replacementValue を返します。 ISNULLこのインスタンスでは または CASE が機能しますが、ステートメントのCASE柔軟性を によってISNULL照合できない複雑なシナリオがあります。

この計算列を追加すると、画面は図 1 のスクリーン ショットのようになります。

FullContactName という名前の計算列を Suppliers テーブルに追加する

図 1: テーブルにという名前 FullContactName の計算列を Suppliers 追加する (フルサイズの画像を表示する場合はクリックします)

計算列に名前を付けて式を入力したら、ツール バーの [保存] アイコンをクリックするか、Ctrl + S キーを押すか、[ファイル] メニューの [保存] を選択して、テーブルに変更を保存します Suppliers

テーブルを保存すると、テーブルの列リストに追加された列を含め、サーバー エクスプローラーがSuppliers更新されます。 さらに、(Formula) テキスト ボックスに入力された式は、不要な空白を取り除き、列名を角かっこ ([]) で囲み、操作の順序をより明示的に示すかっこを含む同等の式に自動的に調整されます。

(((([ContactName]+' (')+case when [ContactTitle] IS NOT NULL 
    then [ContactTitle]+', ' else '' end)+[CompanyName])+')')

Microsoft SQL Server の計算列の詳細については、技術ドキュメントを参照してください。 計算列を作成する手順については、「方法: 計算列を指定する」もチェックします。

注意

既定では、計算列はテーブルに物理的に格納されるのではなく、クエリで参照されるたびに再計算されます。 ただし、[永続化] チェック ボックスをオンにすると、計算列をテーブルに物理的に格納するようにSQL Serverに指示できます。 これにより、計算列にインデックスを作成できるため、句で計算列の値を使用するクエリのパフォーマンスを WHERE 向上させることができます。 詳細については、「 計算列でのインデックスの作成 」を参照してください。

手順 2: 計算列の値を表示する

データ アクセス層の作業を開始する前に、少し時間を取って値を FullContactName 表示しましょう。 サーバー エクスプローラーで、テーブル名をSuppliers右クリックし、コンテキスト メニューから [新しいクエリ] を選択します。 これにより、クエリに含めるテーブルを選択するように求める [クエリ] ウィンドウが表示されます。 テーブルを Suppliers 追加し、[閉じる] をクリックします。 次に、Suppliers テーブルの CompanyNameContactNameContactTitleおよび FullContactName 列をチェックします。 最後に、ツール バーの赤い感嘆符アイコンをクリックしてクエリを実行し、結果を表示します。

図 2 に示すように、結果にはFullContactName、ldquoContactTitleContactName 形式 (CompanyNameCompanyName) を使用して、、ContactName、および ContactTitle の各列が一覧表示されます。

FullContactName は ContactName (ContactTitle、CompanyName) の形式を使用します

図 2: のFullContactName形式 ContactName (、CompanyName) を使用します (フルサイズの画像を表示する場合は、ここをクリックします)ContactTitle

手順 3: データ アクセス層に を追加SuppliersTableAdapterする

アプリケーションでサプライヤー情報を操作するには、まず DAL で TableAdapter と DataTable を作成する必要があります。 これは、前のチュートリアルで説明したのと同じ簡単な手順を使用して行うのが理想的です。 ただし、計算列を使用すると、いくつかのしわが生じ、議論にメリットがあります。

アドホック SQL ステートメントを使用する TableAdapter を使用している場合は、TableAdapter 構成ウィザードを使用して、TableAdapter の メイン クエリに計算列を含めることができます。 ただし、これにより、計算列を含む ステートメントと UPDATE ステートメントが自動生成INSERTされます。 これらのメソッドのいずれかを実行しようとすると、 SqlException というメッセージが表示された が 、ColumnName 列 は計算列であるか、UNION 演算子の結果であるため、変更できません。 INSERTおよび UPDATE ステートメントは TableAdapter と InsertCommandUpdateCommand プロパティを使用して手動で調整できますが、TableAdapter 構成ウィザードが再実行されるたびに、これらのカスタマイズは失われます。

アドホック SQL ステートメントを使用する TableAdapters の脆弱性のため、計算列を操作するときはストアド プロシージャを使用することをお勧めします。 既存のストアド プロシージャを使用している場合は、型指定された DataSet の TableAdapters の既存のストアド プロシージャの使用に関するチュートリアルで説明されているように 、TableAdapter を構成するだけです。 ただし、TableAdapter ウィザードでストアド プロシージャを作成する場合は、最初にメイン クエリから計算列を省略することが重要です。 メイン クエリに計算列を含める場合、TableAdapter 構成ウィザードは、完了時に対応するストアド プロシージャを作成できないことを通知します。 つまり、最初に計算列のないメイン クエリを使用して TableAdapter を構成し、対応するストアド プロシージャと TableAdapter s SelectCommand を手動で更新して計算列を含める必要があります。 この方法は、「TableAdapter を使用するように更新する」チュートリアルで使用JOINされている方法に似ています。

このチュートリアルでは、新しい TableAdapter を追加し、ストアド プロシージャを自動的に作成します。 そのため、最初にメイン クエリから計算列を省略FullContactNameする必要があります。

まず、 フォルダー内の NorthwindWithSprocs DataSet を ~/App_Code/DAL 開きます。 Designerを右クリックし、コンテキスト メニューから新しい TableAdapter を追加することを選択します。 これにより、TableAdapter 構成ウィザードが起動します。 (NORTHWNDConnectionStringWeb.configから) からデータを照会するデータベースを指定し、[次へ] をクリックします。 テーブルのクエリまたは変更 Suppliers を行うストアド プロシージャはまだ作成されていないため、[新しいストアド プロシージャの作成] オプションを選択してウィザードで作成し、[次へ] をクリックします。

[新しいストアド プロシージャの作成] オプションを選択する

図 3: [Create new stored procedures]\(新しいストアド プロシージャの作成\) オプションを選択します (フルサイズの画像を表示するには、ここをクリックします)

その後の手順では、メイン クエリの入力を求められます。 次のクエリを入力すると、各仕入先の SupplierIDCompanyNameContactName、および ContactTitle 列が返されます。 このクエリでは、計算列 (FullContactName) が意図的に省略されることに注意してください。対応するストアド プロシージャを更新して、手順 4 でこの列を含めます。

SELECT SupplierID, CompanyName, ContactName, ContactTitle
FROM Suppliers

メイン クエリを入力して [次へ] をクリックすると、ウィザードでは生成される 4 つのストアド プロシージャに名前を付けられます。 図 4 に示すように、 Suppliers_Selectこれらのストアド プロシージャに 、 Suppliers_InsertSuppliers_Update、および Suppliers_Deleteという名前を付けます。

自動生成ストアド プロシージャの名前をカスタマイズする

図 4: 自動生成されたストアド プロシージャの名前をカスタマイズする (フルサイズの画像を表示するをクリックします)

次のウィザードの手順では、TableAdapter のメソッドに名前を付け、データへのアクセスと更新に使用するパターンを指定できます。 3 つのチェック ボックスはすべてオンのままにしますが、メソッドの名前を にGetSuppliers変更しますGetData。 [完了] をクリックしてウィザードを終了します。

GetData メソッドの名前を GetSuppliers に変更する

図 5: メソッドの名前を GetDataGetSuppliers 変更します (クリックするとフルサイズの画像が表示されます)

[完了] をクリックすると、ウィザードによって 4 つのストアド プロシージャが作成され、TableAdapter と対応する DataTable が型指定された DataSet に追加されます。

手順 4: TableAdapter のメイン クエリに計算列を含めます

次に、手順 3 で作成した TableAdapter と DataTable を更新して、計算列を FullContactName 含める必要があります。 これには、次の 2 つの手順があります。

  1. ストアド プロシージャを Suppliers_Select 更新して計算列を FullContactName 返し、
  2. 対応する FullContactName 列を含むように DataTable を更新します。

まず、サーバー エクスプローラーに移動し、ストアド プロシージャ フォルダーにドリルダウンします。 ストアド プロシージャを Suppliers_Select 開き、計算列を SELECT 含むようにクエリを FullContactName 更新します。

SELECT SupplierID, CompanyName, ContactName, ContactTitle, FullContactName
FROM Suppliers

ツールバーの [保存] アイコンをクリックするか、Ctrl + S キーを押すか、[ファイル] メニューの [保存] オプションを選択して、ストアド プロシージャに対する変更を保存 Suppliers_Select します。

次に、DataSet Designerに戻り、 をSuppliersTableAdapter右クリックし、コンテキスト メニューから [構成] を選択します。 列に Suppliers_Select Data Columns コレクションの列が FullContactName 含まれるようになりました。

TableAdapter の構成ウィザードを実行して DataTable の列を更新する

図 6: TableAdapter の構成ウィザードを実行して DataTable の列を更新する (フルサイズの画像を表示する をクリックします)

[完了] をクリックしてウィザードを終了します。 これにより、 に対応する列が自動的に SuppliersDataTable追加されます。 TableAdapter ウィザードは、列が計算列であり、したがって読み取り専用であることを FullContactName 検出するのに十分なスマートです。 その結果、列の ReadOnly プロパティが に true設定されます。 これを確認するには、 からSuppliersDataTable列を選択し、プロパティ ウィンドウに移動します (図 7 を参照)。 FullContactName列の と DataTypeMaxLength プロパティもそれに応じて設定されることに注意してください。

FullContactName 列が読み取り専用としてマークされている

図 7: 列が FullContactName Read-Only としてマークされている (フルサイズの画像を表示する をクリックします)

手順 5: TableAdapter にメソッドを追加GetSupplierBySupplierIDする

このチュートリアルでは、更新可能なグリッドにサプライヤーを表示する ASP.NET ページを作成します。 過去のチュートリアルでは、DAL からその特定のレコードを厳密に型指定された DataTable として取得し、そのプロパティを更新し、更新された DataTable を DAL に送信して変更をデータベースに反映することで、ビジネス ロジック レイヤーから 1 つのレコードを更新しました。 この最初の手順 (DAL から更新されるレコードを取得する) を実行するには、まず DAL にメソッドを GetSupplierBySupplierID(supplierID) 追加する必要があります。

DataSet デザインで を SuppliersTableAdapter 右クリックし、コンテキスト メニューから [クエリの追加] オプションを選択します。 手順 3 で行ったように、[Create new stored procedure]\(新しいストアド プロシージャの作成\) オプションを選択して、ウィザードで新しいストアド プロシージャを生成します (このウィザード 手順のスクリーンショットについては、図 3 を参照してください)。 このメソッドは複数の列を持つレコードを返すので、行を返す SELECT である SQL クエリを使用することを示し、[次へ] をクリックします。

行を返す SELECT オプションを選択する

図 8: 行を返す SELECT オプションを選択します (クリックするとフルサイズの画像が表示されます)

以降の手順では、このメソッドに対してクエリを使用するように求められます。 次のように入力します。これは、メイン クエリと同じデータ フィールドを返しますが、特定の仕入先に対して返されます。

SELECT SupplierID, CompanyName, ContactName, ContactTitle, FullContactName
FROM Suppliers
WHERE SupplierID = @SupplierID

次の画面では、自動生成されるストアド プロシージャに名前を付けるよう求められます。 このストアド プロシージャ Suppliers_SelectBySupplierID に名前を付け、[次へ] をクリックします。

ストアド プロシージャに名前を付Suppliers_SelectBySupplierID

図 9: ストアド プロシージャ Suppliers_SelectBySupplierID に名前を付ける (クリックするとフルサイズの画像が表示されます)

最後に、TableAdapter に使用するデータ アクセス パターンとメソッド名の入力を求められます。 両方のチェック ボックスをオンのままにしますが、 メソッドと GetDataBy メソッドの名前をそれぞれ と GetSupplierBySupplierIDFillBySupplierID変更FillByします。

TableAdapter メソッドに FillBySupplierID と GetSupplierBySupplierID という名前を付けます

図 10: TableAdapter メソッドに名前を FillBySupplierID 付け GetSupplierBySupplierID 、(クリックするとフルサイズの画像が表示されます)

[完了] をクリックしてウィザードを終了します。

手順 6: ビジネス ロジック レイヤーの作成

手順 1 で作成した計算列を使用する ASP.NET ページを作成する前に、まず BLL に対応するメソッドを追加する必要があります。 手順 7 で作成する [ASP.NET] ページでは、ユーザーが仕入先を表示および編集できるようになります。 したがって、BLL は、少なくとも、すべてのサプライヤーを取得する方法と、特定のサプライヤーを更新するための別の方法を提供する必要があります。

フォルダーに という名前 SuppliersBLLWithSprocs の新しいクラス ファイルを ~/App_Code/BLL 作成し、次のコードを追加します。

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;
    }
}

他の BLL クラスと同様に、 SuppliersBLLWithSprocs にはprotected、 クラスのSuppliersTableAdapterインスタンスを返す プロパティと、 と の 2 つのpublicメソッドがあります GetSuppliersUpdateSupplierAdapter メソッドは GetSuppliers 、データ アクセス層の SuppliersDataTable 対応する GetSupplier メソッドによって返される を呼び出して返します。 メソッドは UpdateSupplier 、DAL メソッドの呼び出しを介して更新される特定の GetSupplierBySupplierID(supplierID) サプライヤーに関する情報を取得します。 次に、および ContactTitle の各プロパティをCategoryNameContactName更新し、変更されたSuppliersRowオブジェクトを渡して Data Access Layer の Update メソッドを呼び出して、これらの変更をデータベースにコミットします。

注意

CompanyNameSupplierID除き、Suppliers テーブルのすべての列で値が許可NULLされます。 したがって、渡されたcontactNameパラメーターまたはcontactTitleパラメーターがある場合はnull、 メソッドと メソッドをそれぞれ使用してSetContactNameNull、対応する ContactName プロパティと SetContactTitleNullContactTitle プロパティをNULLデータベース値に設定する必要があります。

手順 7: プレゼンテーション レイヤーから計算列を操作する

計算列がテーブルに Suppliers 追加され、DAL と BLL がそれに応じて更新されたので、計算列で動作する ASP.NET ページを FullContactName 作成する準備ができました。 まず、フォルダー内のページをComputedColumns.aspxAdvancedDAL開き、GridView をツールボックスからDesignerにドラッグします。 GridView の ID プロパティを に Suppliers 設定し、そのスマート タグから という名前 SuppliersDataSourceの新しい ObjectDataSource にバインドします。 手順 6 で追加したクラスを SuppliersBLLWithSprocs 使用するように ObjectDataSource を構成し、[次へ] をクリックします。

SuppliersBLLWithSprocs クラスを使用するように ObjectDataSource を構成する

図 11: クラスを使用するように ObjectDataSource を構成する SuppliersBLLWithSprocs (クリックするとフルサイズの画像が表示されます)

クラスGetSuppliersには、 と UpdateSupplierの 2 つのメソッドしか定義SuppliersBLLWithSprocsされていません。 これら 2 つのメソッドが SELECT タブと UPDATE タブでそれぞれ指定されていることを確認し、[完了] をクリックして ObjectDataSource の構成を完了します。

データ ソース構成ウィザードが完了すると、Visual Studio によって、返される各データ フィールドの BoundField が追加されます。 BoundField をSupplierID削除し、、ContactTitleおよび FullContactName BoundFields のCompanyNameContactNameプロパティをそれぞれ Company、Contact Name、Title、および Full Contact Name に変更HeaderTextします。 スマート タグから、[編集を有効にする] チェック ボックスをチェックして、GridView の組み込み編集機能を有効にします。

GridView に BoundFields を追加するだけでなく、データ ソース ウィザードを完了すると、Visual Studio で ObjectDataSource の OldValuesParameterFormatString プロパティがoriginal_{0}に設定されます。 この設定を既定値 {0} に戻します。

GridView と ObjectDataSource に対してこれらの編集を行った後、宣言型マークアップは次のようになります。

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

次に、ブラウザーからこのページにアクセスします。 図 12 に示すように、各仕入先は列を含むFullContactNameグリッドに一覧表示されます。その値は、単に (ContactTitleCompanyName) としてContactName書式設定された他の 3 つの列の連結です。

各サプライヤーがグリッドに一覧表示される

図 12: 各仕入先がグリッドに一覧表示されている (フルサイズの画像を表示する をクリックします)

特定のサプライヤーの [編集] ボタンをクリックするとポストバックが発生し、その行が編集インターフェイスにレンダリングされます (図 13 を参照)。 最初の 3 つの列は、既定の編集インターフェイス (プロパティがデータ フィールドの値に設定されている TextBox コントロール Text ) でレンダリングされます。 ただし、列は FullContactName テキストとして残ります。 データ ソース構成ウィザードの完了時に BoundFields が GridView に追加されると、 FullContactName 内の対応するFullContactNameSuppliersDataTableのプロパティが にtrue設定されているため、BoundField の ReadOnly プロパティが ReadOnlytrue設定されました。 手順 4 で説明したように、 FullContactName TableAdapter が列が計算列であることを検出したため、s ReadOnly プロパティが に true 設定されました。

FullContactName 列は編集できません

図 13: 列は FullContactName 編集できません (フルサイズの画像を表示する をクリックします)

先に進み、編集可能な列の 1 つ以上の値を更新し、[更新] をクリックします。 の値が変更を FullContactName 反映するように自動的に更新される方法に注意してください。

注意

現在、GridView では編集可能なフィールドに BoundFields が使用されているため、既定の編集インターフェイスになります。 CompanyNameフィールドは必須であるため、RequiredFieldValidator を含む TemplateField に変換する必要があります。 私はこれを興味のある読者のための演習として残します。 BoundField を TemplateField に変換し、検証コントロールを追加する手順については、「Editing and Inserting Interfaces 」チュートリアルに関する検証コントロールの追加に関するチュートリアルを参照してください。

まとめ

テーブルのスキーマを定義する場合、Microsoft SQL Serverでは計算列を含めることができます。 これらは、通常、同じレコード内の他の列の値を参照する式から値が計算される列です。 計算列の値は式に基づいているため、値は読み取り専用であり、 または UPDATE ステートメントに値をINSERT割り当てることはできません。 これにより、対応する INSERTUPDATE、および DELETE ステートメントを自動的に生成しようとする TableAdapter のメイン クエリで計算列を使用する場合、課題が発生します。

このチュートリアルでは、計算列によってもたらされる課題を回避するための手法について説明しました。 特に、TableAdapter のストアド プロシージャを使用して、アドホック SQL ステートメントを使用する TableAdapters に固有の脆弱性を克服しました。 TableAdapter ウィザードで新しいストアド プロシージャを作成する場合は、データ変更ストアド プロシージャが生成されるのを妨げるので、メイン クエリで計算列を最初に省略することが重要です。 TableAdapter が最初に構成された後、その SelectCommand ストアド プロシージャを再ツールして、計算列を含めることができます。

幸せなプログラミング!

著者について

7 冊の ASP/ASP.NET 書籍の著者であり、 4GuysFromRolla.com の創設者である Scott Mitchell は、1998 年から Microsoft Web テクノロジと協力しています。 Scott は独立したコンサルタント、トレーナー、ライターとして働いています。 彼の最新の本は サムズ・ティーチ・自分自身 ASP.NET 24時間で2.0です。 にアクセスするか、ブログを使用して にアクセスmitchell@4GuysFromRolla.comできます。これは でhttp://ScottOnWriting.NET見つけることができます。

特別な感謝

このチュートリアル シリーズは、多くの役に立つ校閲者によってレビューされました。 このチュートリアルのリード レビュー担当者は、ヒルトン ガイゼナウとテレサ マーフィーでした。 今後の MSDN の記事を確認することに関心がありますか? その場合は、 にmitchell@4GuysFromRolla.com行をドロップしてください。