計算列を使用する (C#)
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
クエリが自動的に再生成されるということです。 したがって、 から手動で削除された INSERT
計算列と UPDATE
クエリは、ウィザードを再実行すると再び表示されます。 ストアド プロシージャを使用する TableAdapter は、この脆弱性に悩まされることはありませんが、手順 3 で対処する独自の違いがあります。
このチュートリアルでは、Northwind データベースのテーブルに計算列を Suppliers
追加し、対応する TableAdapter を作成して、このテーブルとその計算列を操作します。 TableAdapter 構成ウィザードを使用するときにカスタマイズが失われないよう、アドホック SQL ステートメントではなく TableAdapter でストアド プロシージャを使用します。
始めましょう。
手順 1: 計算列をテーブルに追加するSuppliers
Northwind データベースには計算列がないため、自分で列を追加する必要があります。 このチュートリアルでは、 という名前のテーブルに計算列をSuppliers
追加し、連絡先の名前、タイトル、および勤務先の会社を次の形式で返します。 ContactName
ContactTitle
CompanyName
FullContactName
この計算列は、仕入先に関する情報を表示するときにレポートで使用される場合があります。
まず、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 のスクリーン ショットのようになります。
図 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 テーブルの CompanyName
、ContactName
ContactTitle
および FullContactName
列をチェックします。 最後に、ツール バーの赤い感嘆符アイコンをクリックしてクエリを実行し、結果を表示します。
図 2 に示すように、結果にはFullContactName
、ldquoContactTitle
ContactName
形式 (CompanyName
、CompanyName
) を使用して、、ContactName
、および ContactTitle
の各列が一覧表示されます。
図 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 の脆弱性のため、計算列を操作するときはストアド プロシージャを使用することをお勧めします。 既存のストアド プロシージャを使用している場合は、型指定された DataSet の 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: [Create new stored procedures]\(新しいストアド プロシージャの作成\) オプションを選択します (フルサイズの画像を表示するには、ここをクリックします)
その後の手順では、メイン クエリの入力を求められます。 次のクエリを入力すると、各仕入先の 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 つのチェック ボックスはすべてオンのままにしますが、メソッドの名前を にGetSuppliers
変更しますGetData
。 [完了] をクリックしてウィザードを終了します。
図 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 ページを作成します。 過去のチュートリアルでは、DAL からその特定のレコードを厳密に型指定された DataTable として取得し、そのプロパティを更新し、更新された DataTable を DAL に送信して変更をデータベースに反映することで、ビジネス ロジック レイヤーから 1 つのレコードを更新しました。 この最初の手順 (DAL から更新されるレコードを取得する) を実行するには、まず DAL にメソッドを GetSupplierBySupplierID(supplierID)
追加する必要があります。
DataSet デザインで を SuppliersTableAdapter
右クリックし、コンテキスト メニューから [クエリの追加] オプションを選択します。 手順 3 で行ったように、[Create new stored procedure]\(新しいストアド プロシージャの作成\) オプションを選択して、ウィザードで新しいストアド プロシージャを生成します (このウィザード 手順のスクリーンショットについては、図 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
作成し、次のコードを追加します。
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
メソッドがあります GetSuppliers
UpdateSupplier
。Adapter
メソッドは GetSuppliers
、データ アクセス層の SuppliersDataTable
対応する GetSupplier
メソッドによって返される を呼び出して返します。 メソッドは UpdateSupplier
、DAL メソッドの呼び出しを介して更新される特定の GetSupplierBySupplierID(supplierID)
サプライヤーに関する情報を取得します。 次に、および ContactTitle
の各プロパティをCategoryName
ContactName
更新し、変更されたSuppliersRow
オブジェクトを渡して Data Access Layer の Update
メソッドを呼び出して、これらの変更をデータベースにコミットします。
注意
と CompanyName
をSupplierID
除き、Suppliers テーブルのすべての列で値が許可NULL
されます。 したがって、渡されたcontactName
パラメーターまたはcontactTitle
パラメーターがある場合はnull
、 メソッドと メソッドをそれぞれ使用してSetContactNameNull
、対応する ContactName
プロパティと SetContactTitleNull
ContactTitle
プロパティをNULL
データベース値に設定する必要があります。
手順 7: プレゼンテーション レイヤーから計算列を操作する
計算列がテーブルに Suppliers
追加され、DAL と BLL がそれに応じて更新されたので、計算列で動作する ASP.NET ページを FullContactName
作成する準備ができました。 まず、フォルダー内のページをComputedColumns.aspx
AdvancedDAL
開き、GridView をツールボックスからDesignerにドラッグします。 GridView の ID
プロパティを に Suppliers
設定し、そのスマート タグから という名前 SuppliersDataSource
の新しい ObjectDataSource にバインドします。 手順 6 で追加したクラスを SuppliersBLLWithSprocs
使用するように ObjectDataSource を構成し、[次へ] をクリックします。
図 11: クラスを使用するように ObjectDataSource を構成する SuppliersBLLWithSprocs
(クリックするとフルサイズの画像が表示されます)
クラスGetSuppliers
には、 と UpdateSupplier
の 2 つのメソッドしか定義SuppliersBLLWithSprocs
されていません。 これら 2 つのメソッドが SELECT タブと UPDATE タブでそれぞれ指定されていることを確認し、[完了] をクリックして ObjectDataSource の構成を完了します。
データ ソース構成ウィザードが完了すると、Visual Studio によって、返される各データ フィールドの BoundField が追加されます。 BoundField をSupplierID
削除し、、ContactTitle
および FullContactName
BoundFields のCompanyName
ContactName
プロパティをそれぞれ 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 ステートメントを使用する 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行をドロップしてください。
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示