Share via


計算列を使用する (VB)

作成者: 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クエリが自動的に再生成される点です。 したがって、ウィザードを再実行すると、 クエリと UPDATE クエリからINSERT手動で削除された計算列が再び表示されます。 ストアド プロシージャを使用する TableAdapters は、この脆弱性に悩まされることはありませんが、手順 3 で対処する独自の風変わりがあります。

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

始めましょう。

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

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

まず、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 を返します。 または CASE がこのISNULLインスタンスでは機能しますが、ステートメントのCASE柔軟性を によってISNULL照合できない複雑なシナリオがあります。

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

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

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

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

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

(((([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、 形式 (ContactTitleCompanyName) を使用して、、ContactName、および ContactTitle の各列がContactName一覧表示CompanyNameされます。

FullContactName では、ContactName (ContactTitle、CompanyName) の形式が使用されます

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

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

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

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

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

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

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

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

図 3: [新しいストアド プロシージャの作成] オプションを選択します (クリックするとフルサイズの画像が表示されます)

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

SELECT SupplierID, CompanyName, ContactName, ContactTitle
FROM Suppliers

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

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

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

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

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

DataSet デザインで を SuppliersTableAdapter 右クリックし、コンテキスト メニューから [クエリの追加] オプションを選択します。 手順 3 で行ったように、[新しいストアド プロシージャの作成] オプションを選択して、ウィザードで新しいストアド プロシージャを生成します (このウィザード手順のスクリーンショットについては、図 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 メソッドに名前を付け FillBySupplierIDGetSupplierBySupplierID (フルサイズの画像を表示する をクリックします)

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

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

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

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

Imports NorthwindWithSprocsTableAdapters
<System.ComponentModel.DataObject()> _
Public Class SuppliersBLLWithSprocs
    Private _suppliersAdapter As SuppliersTableAdapter = Nothing
    Protected ReadOnly Property Adapter() As SuppliersTableAdapter
        Get
            If _suppliersAdapter Is Nothing Then
                _suppliersAdapter = New SuppliersTableAdapter()
            End If
            Return _suppliersAdapter
        End Get
    End Property
    <System.ComponentModel.DataObjectMethodAttribute _
        (System.ComponentModel.DataObjectMethodType.Select, True)> _
    Public Function GetSuppliers() As NorthwindWithSprocs.SuppliersDataTable
        Return Adapter.GetSuppliers()
    End Function
    <System.ComponentModel.DataObjectMethodAttribute _
        (System.ComponentModel.DataObjectMethodType.Update, True)> _
    Public Function UpdateSupplier(companyName As String, contactName As String, _
        contactTitle As String, supplierID As Integer) As Boolean
        Dim suppliers As NorthwindWithSprocs.SuppliersDataTable = _
            Adapter.GetSupplierBySupplierID(supplierID)
        If suppliers.Count = 0 Then
            ' no matching record found, return false
            Return False
        End If
        Dim supplier As NorthwindWithSprocs.SuppliersRow = suppliers(0)
        supplier.CompanyName = companyName
        If contactName Is Nothing Then 
            supplier.SetContactNameNull() 
        Else 
            supplier.ContactName = contactName
        End If
        If contactTitle Is Nothing Then 
            supplier.SetContactTitleNull() 
        Else 
            supplier.ContactTitle = contactTitle
        End If
        ' Update the product record
        Dim rowsAffected As Integer = Adapter.Update(supplier)
        ' Return true if precisely one row was updated, otherwise false
        Return rowsAffected = 1
    End Function
End Class

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

注意

CompanyNameSupplierID除き、Suppliers テーブル内のすべての列で値が許可されますNULL。 したがって、渡されたcontactNameパラメーターまたはcontactTitleパラメーターがある場合はNothing、 メソッドと メソッドをそれぞれ使用してSetContactNameNull、対応する ContactName プロパティと ContactTitleSetContactTitleNull プロパティ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 (フルサイズの画像を表示するにはクリックします)

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

データ ソース構成ウィザードが完了すると、Visual Studio によって、返される各データ フィールドの BoundField が追加されます。 BoundField をSupplierID削除し、、、ContactTitleContactName、および FullContactName BoundFields のCompanyNameプロパティをそれぞれ 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 ステートメントを使用する TableAdapter に固有の脆弱性を克服しました。 TableAdapter ウィザードで新しいストアド プロシージャを作成する場合は、データ変更ストアド プロシージャの生成が妨げられるため、メイン クエリで計算列を最初に省略することが重要です。 TableAdapter が最初に構成された後、その SelectCommand ストアド プロシージャを再ツールして計算列を含めることができます。

プログラミングに満足!

著者について

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

特別な感謝

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