計算列を使用する (VB)
Microsoft SQL Serverでは、データベース テーブルを作成するときに、通常は同じデータベース レコード内の他の値を参照する式から値を計算する計算列を定義できます。 このような値はデータベースでは読み取り専用であり、TableAdapters を使用する場合は特別な考慮事項が必要です。 このチュートリアルでは、計算列によってもたらされる課題に対応する方法について説明します。
はじめに
Microsoft SQL Server では、計算列を使用できます。これは、通常、同じテーブル内の他の列の値を参照する式から値が計算される列です。 たとえば、時間追跡データ モデルには、、 Rate
EmployeeID
Duration
などの列を含む ServicePerformed
という名前ServiceLog
のテーブルが含まれる場合があります。 サービス項目あたりの支払額 (期間を乗算したレート) は、Web ページまたはその他のプログラム インターフェイスを使用して計算できますが、この情報を報告した という名前AmountDue
の列をServiceLog
テーブルに含めるのに便利な場合があります。 この列は通常の列として作成できますが、 または Duration
列の値が変更された場合は常に更新するRate
必要があります。 より良い方法は、 式 Rate * Duration
をAmountDue
使用して列を計算列にすることです。 これを行うと、クエリで列値が参照されるたびに、SQL Serverによって列の値が自動的に計算AmountDue
されます。
計算列の値は式によって決定されるため、このような列は読み取り専用であるため、または UPDATE
ステートメントでINSERT
値を割り当てることはできません。 ただし、計算列がアドホック SQL ステートメントを使用する TableAdapter のメイン クエリの一部である場合は、自動生成された INSERT
ステートメントと UPDATE
ステートメントに自動的に含まれます。 したがって、TableAdapter とINSERT
UPDATE
クエリとInsertCommand
UpdateCommand
プロパティを更新して、計算列への参照を削除する必要があります。
アドホック SQL ステートメントを使用する TableAdapter で計算列を使用する場合の課題の 1 つは、TableAdapter 構成ウィザードが完了するたびに TableAdapter とINSERT
UPDATE
クエリが自動的に再生成される点です。 したがって、ウィザードを再実行すると、 クエリと UPDATE
クエリからINSERT
手動で削除された計算列が再び表示されます。 ストアド プロシージャを使用する TableAdapters は、この脆弱性に悩まされることはありませんが、手順 3 で対処する独自の風変わりがあります。
このチュートリアルでは、Northwind データベースのテーブルに計算列を Suppliers
追加し、対応する TableAdapter を作成して、このテーブルとその計算列を操作します。 TableAdapter 構成ウィザードを使用するときにカスタマイズが失われるのをなくすように、アドホック SQL ステートメントの代わりに TableAdapter でストアド プロシージャを使用します。
始めましょう。
手順 1: 計算列をテーブルに追加するSuppliers
Northwind データベースには計算列がないため、自分で列を追加する必要があります。 このチュートリアルでは、 というFullContactName
名前のテーブルに計算列をSuppliers
追加し、連絡先の名前、タイトル、および勤務先の会社を次の形式 ContactName
で返します。ContactTitle
CompanyName
この計算列は、仕入先に関する情報を表示するときにレポートで使用できます。
まず、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 のスクリーン ショットのようになります。
図 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 テーブルの CompanyName
、ContactName
、ContactTitle
、および FullContactName
列をチェックします。 最後に、ツール バーの赤い感嘆符アイコンをクリックしてクエリを実行し、結果を表示します。
図 2 に示すように、結果にはFullContactName
、 形式 (ContactTitle
、CompanyName
) を使用して、、ContactName
、および ContactTitle
の各列がContactName
一覧表示CompanyName
されます。
図 2: はFullContactName
形式 ContactName
(、CompanyName
) を使用します (ContactTitle
フルサイズの画像を表示する場合はクリックします)
手順 3: データ アクセス層に を追加SuppliersTableAdapter
する
アプリケーションでサプライヤー情報を操作するには、最初に DAL で TableAdapter と DataTable を作成する必要があります。 これは、前のチュートリアルで調べたのと同じ簡単な手順を使用して行うのが理想的です。 ただし、計算列を使用すると、いくつかのしわが発生し、議論にメリットがあります。
アドホック SQL ステートメントを使用する TableAdapter を使用している場合は、TableAdapter 構成ウィザードを使用して、TableAdapter の メイン クエリに計算列を含めることができます。 ただし、これにより、計算列を含む ステートメントと UPDATE
ステートメントが自動生成INSERT
されます。 これらのメソッドのいずれかを実行しようとすると、 SqlException
列 ColumnName が計算列であるか UNION 演算子の結果であるため、 というメッセージを含む を変更できません。 INSERT
および UPDATE
ステートメントは TableAdapter と InsertCommand
UpdateCommand
プロパティを使用して手動で調整できますが、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 構成ウィザードが起動します。 (NORTHWNDConnectionString
Web.config
から) からデータを照会するデータベースを指定し、[次へ] をクリックします。 テーブルのクエリまたは変更 Suppliers
用にストアド プロシージャをまだ作成していないため、[新しいストアド プロシージャの作成] オプションを選択してウィザードで作成し、[次へ] をクリックします。
図 3: [新しいストアド プロシージャの作成] オプションを選択します (クリックするとフルサイズの画像が表示されます)
その後の手順では、メイン クエリの入力を求められます。 次のクエリを入力すると、各仕入先の SupplierID
、 CompanyName
、 ContactName
、および ContactTitle
列が返されます。 このクエリでは計算列 (FullContactName
) が意図的に省略されることに注意してください。対応するストアド プロシージャを更新して、手順 4 でこの列を含めます。
SELECT SupplierID, CompanyName, ContactName, ContactTitle
FROM Suppliers
メイン クエリを入力し、[次へ] をクリックすると、ウィザードによって生成される 4 つのストアド プロシージャに名前を付けられます。 図 4 に示すように、Suppliers_Select
これらのストアド プロシージャに 、Suppliers_Insert
、 Suppliers_Update
Suppliers_Delete
という名前を付けます。
図 4: 自動生成されたストアド プロシージャの名前をカスタマイズする (フルサイズの画像を表示する をクリックします)
次のウィザードの手順では、TableAdapter のメソッドに名前を付け、データへのアクセスと更新に使用するパターンを指定できます。 3 つのチェック ボックスをすべてオンのままにしますが、 メソッドの名前を GetData
に GetSuppliers
変更します。 [完了] をクリックしてウィザードを終了します。
図 5: メソッドの名前を GetData
に GetSuppliers
変更します (クリックするとフルサイズの画像が表示されます)
[完了] をクリックすると、ウィザードによって 4 つのストアド プロシージャが作成され、TableAdapter と対応する DataTable が型指定された DataSet に追加されます。
手順 4: TableAdapter のメイン クエリに計算列を含む
ここで、手順 3 で作成した TableAdapter と DataTable を更新して、計算列を FullContactName
含める必要があります。 これには、次の 2 つの手順があります。
- 計算列を
Suppliers_Select
返すようにストアド プロシージャをFullContactName
更新し、 - 対応する
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
列が含まれるようになりました。
図 6: TableAdapter の構成ウィザードを実行して DataTable の列を更新する (フルサイズの画像を表示する をクリックします)
[完了] をクリックしてウィザードを終了します。 これにより、対応する列が に自動的に SuppliersDataTable
追加されます。 TableAdapter ウィザードは、列が計算列であるため、読み取り専用であることを FullContactName
検出するのに十分なスマートです。 そのため、列の ReadOnly
プロパティを に true
設定します。 これを確認するには、 からSuppliersDataTable
列を選択し、プロパティ ウィンドウに移動します (図 7 を参照)。 FullContactName
列の と DataType
MaxLength
プロパティもそれに応じて設定されることに注意してください。
図 7: 列が FullContactName
Read-Only としてマークされている (フルサイズの画像を表示する をクリックします)
手順 5: TableAdapter にメソッドを追加GetSupplierBySupplierID
する
このチュートリアルでは、更新可能なグリッドにサプライヤーを表示する ASP.NET ページを作成します。 過去のチュートリアルでは、厳密に型指定された DataTable として DAL からその特定のレコードを取得し、そのプロパティを更新し、更新された DataTable を DAL に送信して変更をデータベースに反映することで、ビジネス ロジック レイヤーから 1 つのレコードを更新しました。 この最初の手順 (DAL から更新されるレコードを取得する) を実行するには、まず DAL にメソッドを GetSupplierBySupplierID(supplierID)
追加する必要があります。
DataSet デザインで を SuppliersTableAdapter
右クリックし、コンテキスト メニューから [クエリの追加] オプションを選択します。 手順 3 で行ったように、[新しいストアド プロシージャの作成] オプションを選択して、ウィザードで新しいストアド プロシージャを生成します (このウィザード手順のスクリーンショットについては、図 3 を参照してください)。 このメソッドは複数の列を持つレコードを返すので、行を返す SELECT である SQL クエリを使用することを示し、[次へ] をクリックします。
図 8: 行を返す SELECT オプションを選択します (フルサイズの画像を表示する場合はクリックします)
その後の手順では、このメソッドに使用するクエリを求められます。 次のように入力します。これは、メイン クエリと同じデータ フィールドを返しますが、特定の仕入先に対して返されます。
SELECT SupplierID, CompanyName, ContactName, ContactTitle, FullContactName
FROM Suppliers
WHERE SupplierID = @SupplierID
次の画面では、自動生成されるストアド プロシージャに名前を付けるよう求められます。 このストアド プロシージャ Suppliers_SelectBySupplierID
に名前を付け、[次へ] をクリックします。
図 9: ストアド プロシージャ Suppliers_SelectBySupplierID
に名前を付ける (クリックするとフルサイズの画像が表示されます)
最後に、TableAdapter に使用するデータ アクセス パターンとメソッド名の入力を求められます。 両方のチェック ボックスをオンのままにしますが、 メソッドと GetDataBy
メソッドの名前をそれぞれ と GetSupplierBySupplierID
にFillBySupplierID
変更FillBy
します。
図 10: TableAdapter メソッドに名前を付け FillBySupplierID
、 GetSupplierBySupplierID
(フルサイズの画像を表示する をクリックします)
[完了] をクリックしてウィザードを終了します。
手順 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
返す プロパティがあります GetSuppliers
UpdateSupplier
。Adapter
メソッドは GetSuppliers
、データ アクセス層の SuppliersDataTable
対応する GetSupplier
メソッドによって返される を呼び出して返します。 メソッドは UpdateSupplier
、DAL メソッドの呼び出しを介して更新される特定の GetSupplierBySupplierID(supplierID)
サプライヤーに関する情報を取得します。 次に、、、および ContactTitle
の各プロパティをCategoryName
更新し、変更されたSuppliersRow
オブジェクトを渡してデータ アクセス層の Update
メソッドを呼び出して、これらの変更をデータベースにコミットします。 ContactName
注意
と CompanyName
をSupplierID
除き、Suppliers テーブル内のすべての列で値が許可されますNULL
。 したがって、渡されたcontactName
パラメーターまたはcontactTitle
パラメーターがある場合はNothing
、 メソッドと メソッドをそれぞれ使用してSetContactNameNull
、対応する ContactName
プロパティと ContactTitle
SetContactTitleNull
プロパティNULL
をデータベース値に設定する必要があります。
手順 7: プレゼンテーション レイヤーから計算列を操作する
計算列がテーブルに Suppliers
追加され、DAL と BLL がそれに応じて更新されたので、計算列で動作する ASP.NET ページを作成する FullContactName
準備ができました。 まず、フォルダー内のページをComputedColumns.aspx
AdvancedDAL
開き、GridView をツールボックスからDesignerにドラッグします。 GridView の ID
プロパティを に Suppliers
設定し、スマート タグから という名前 SuppliersDataSource
の新しい ObjectDataSource にバインドします。 手順 6 で追加したクラスを SuppliersBLLWithSprocs
使用するように ObjectDataSource を構成し、[次へ] をクリックします。
図 11: クラスを使用するように ObjectDataSource を構成する SuppliersBLLWithSprocs
(フルサイズの画像を表示するにはクリックします)
クラスにはSuppliersBLLWithSprocs
、 と UpdateSupplier
の 2 つのメソッドのみが定義されていますGetSuppliers
。 これら 2 つのメソッドが SELECT タブと UPDATE タブでそれぞれ指定されていることを確認し、[完了] をクリックして ObjectDataSource の構成を完了します。
データ ソース構成ウィザードが完了すると、Visual Studio によって、返される各データ フィールドの BoundField が追加されます。 BoundField をSupplierID
削除し、、、ContactTitle
ContactName
、および 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
含むグリッドに一覧表示されます。値は、単に (ContactTitle
、CompanyName
) としてContactName
書式設定された他の 3 つの列の連結です。
図 12: 各サプライヤーがグリッドに一覧表示されている (フルサイズの画像を表示する をクリックします)
特定のサプライヤーの [編集] ボタンをクリックするとポストバックが発生し、その行が編集インターフェイスにレンダリングされます (図 13 を参照)。 最初の 3 つの列は、既定の編集インターフェイス (プロパティがデータ フィールドの値に設定されている TextBox コントロール Text
) でレンダリングされます。 ただし、列は FullContactName
テキストとして残ります。 データ ソース構成ウィザードの完了時に BoundFields が GridView に追加されると、 FullContactName
内の対応するFullContactName
列SuppliersDataTable
のプロパティが にTrue
設定されているため、BoundField の ReadOnly
プロパティは ReadOnly
にTrue
設定されました。 手順 4 で示したように、 FullContactName
TableAdapter が列が計算列であることを検出したため、s ReadOnly
プロパティは に True
設定されました。
図 13: 列は FullContactName
編集できません (フルサイズの画像を表示するをクリックします)
先に進み、編集可能な列の 1 つ以上の値を更新し、[更新] をクリックします。 の値が変更を FullContactName
反映するように自動的に更新される方法に注意してください。
注意
現在、GridView では編集可能なフィールドに BoundFields が使用され、既定の編集インターフェイスが作成されます。 CompanyName
フィールドは必須であるため、RequiredFieldValidator を含む TemplateField に変換する必要があります。 興味のある読者のための演習としてこれを残します。 BoundField を TemplateField に変換し、検証コントロールを追加する手順については、「Editing and Inserting Interfaces 」チュートリアルへの検証コントロールの追加に関するチュートリアルを参照してください。
まとめ
テーブルのスキーマを定義する場合、Microsoft SQL Serverでは計算列を含めることができます。 これらは、通常、同じレコード内の他の列の値を参照する式から値が計算される列です。 計算列の値は式に基づいているため、値は読み取り専用であり、 ステートメントまたは UPDATE
ステートメントに値をINSERT
割り当てることはできません。 これにより、対応する INSERT
、UPDATE
、および 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行をドロップしてください。
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示