この記事では、CheckBox コントロールを含む DataGrid を作成します。このコントロールを使用すると、ユーザーは詳細を参照するために複数の列を選択できます。動的 SQL のこの機能を回復する方法がない場合は、IN 操作を使用する必要があります。
この記事の最後では、文字列を区切り文字で区切られた部分文字列に分割するための SQL Server ユーザー定義関数 (UDF) を作成しました。この記事では、このような UDF がどのように役立つかを見ていきます。ユーザーがチェックボックス コントロールを選択することで DataGrid 内のいくつかのレコードを選択できる Web フォームを作成します。これらのチェックされたレコードの詳細は、フォームの別の DataGrid に表示されます。このフォームは下の図のようになります。
以下に、フォームの作成に使用した ASPX を示します。注: TemplateColumn および Checkbox コントロールを使用して DataGrid 列を増やす方法。また、DataGrid の DataKeyField プロパティを使用して、データベース レコードのどのフィールドに最初の行のキー識別子が含まれるかをオブジェクトに伝えます。
<form id="Form1" Method="post" runat="server">
<asp:DataGrid id="DataGrid1" runat="サーバー"
AutoGenerateColumns="False" DataKeyField="従業員ID">
<コラム>
<asp:TemplateColumn>
<アイテムテンプレート>
<asp:CheckBox runat="server" ID="EmployeeCheckBox" />
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn>
<アイテムテンプレート>
<%# DataBinder.Eval(Container.DataItem, "LastName") %>,
<%# DataBinder.Eval(Container.DataItem, "FirstName") %>
</ItemTemplate>
</asp:TemplateColumn>
</列>
</asp:DataGrid>
<hr>
<asp:Button id="注文" runat="server" Text="注文の表示"></asp:Button>
<時間>
<asp:DataGrid ID="DataGrid2" Runat="server" AutoGenerateColumns="True" />
</form>
フォームがロードされて初期化されるとき、最上位の DataGrid を組み立てる必要があります。このコードは、エンタープライズ ライブラリを使用して SQL Sever Northwind サンプル データベースにアクセスし、「SELECT EmployeeID, FirstName, LastName FROM Employees」ステートメントを実行します。ロード イベントのコードは次のとおりです。
private void Page_Load(object sender, System.EventArgs e)
{
if(!Page.IsPostBack)
{
データベース db = DatabaseFactory.CreateDatabase();
DBCommandWrapper dbCommandWrapper;
using(dbCommandWrapper = db.GetSqlStringCommandWrapper(SELECT_EMPLOYEES))
{
(IDataReader dataReader = db.ExecuteReader(dbCommandWrapper)) を使用します。
{
DataGrid1.DataSource = データリーダー;
DataGrid1.DataBind();
}
}
}
、
データベース内の従業員と一致し、注文データに関連する 2 番目のデータ テーブルを表示したいとします。これを行う 1 つの方法は、動的 SQL を作成し、WHERE ステートメントに必要なすべての EmployeeID の OR 条件を使用することです。
2 番目の方法は、WHERE ステートメントの IN 操作を使用する方法です。 IN 演算は式のリストを比較します。たとえば、次のステートメントは、従業員 IDS 7 と 4 の間の情報を返します。
SELECT EmployeeID, FirstName, LastName FROM Employees WHERE EmployeeID IN (7, 4)
概念的には、渡された ID をクエリするために単一の文字列パラメータを使用したいと考えていますが、おそらく単一の文字列として IN 操作に使用することはできません。単一の文字列パラメータ。この場合、SQL ステートメントは「WHERE Employee IN ('7, 4')」となり、EmployeeID の型は varchar ではなく int であるため、データベースはエラー メッセージを返します。
ただし、この記事で構築した Split 関数を使用して、文字列をさまざまな値に分割します。文字列「7, 4」をsplit関数に渡すと、値4と7に対応する2つのレコードが取得されます。従業員を選択し、その注文の合計をカウントする SQL クエリは次のようになります。
SELECT count(*) AS Orders, E.FirstName, E.LastName
FROM Orders O
INNER JOIN Employees E ON O.EmployeeID = E.EmployeeID
WHERE E.EmployeeID IN(SELECT Value FROM fn_Split(@employeeIDs, ','))
GROUP BY FirstName, LastName
ORDER BY count(*) DESC
上記のクエリを使用するために必要なのは、@employeeIDs パラメータを確立して渡す必要があることです。このパラメータは、カンマで区切られた ID のリストになります。この文字列を構築するには、行がユーザーによって選択されたかどうかを確認するために、行数を繰り返して各チェックボックス コントロールをチェックするループを使用する必要があります。ユーザーが行を選択すると、テーブルの DataKeys プロパティ (EmployeeID フィールドを指すように ASPX ファイル内に作成されたもの) から検査者を抽出することによって、キーが従業員に保存されます。
プライベート文字列 GetCheckedEmployeeIDs()
{
文字列区切り文字 = String.Empty;
StringBuilder 従業員 ID = new StringBuilder();
for(int i = 0; i < DataGrid1.Items.Count; i++)
{
チェックボックスチェックボックス;
checkbox = DataGrid1.Items[i].FindControl("EmployeeCheckBox") as CheckBox;
if(checkbox != null && checkbox.Checked == true)
{
従業員IDs.Append(区切り文字 + DataGrid1.DataKeys[i].ToString());
区切り文字 = ",";
}
従業員IDs.ToString()を返します
。
は
、「10, 7, 20」のような文字列を返します。 Orders ボタンのクリック イベント ハンドラーには、SQL に情報を渡して従業員と注文のリストを取得し、その結果を 2 番目の DataGrid オブジェクトにバインドするメソッドが含まれます。
private void Orders_Click(オブジェクト送信者、System.EventArgs e)
{
文字列従業員IDs = GetCheckedEmployeeIDs();
データベース db = DatabaseFactory.CreateDatabase();
DBCommandWrapper dbCommandWrapper;
using(dbCommandWrapper = db.GetSqlStringCommandWrapper(SELECT_ORDERS))
{
dbCommandWrapper.AddInParameter("@employeeIDs", DbType.String, 従業員IDs);
(IDataReader dataReader = db.ExecuteReader(dbCommandWrapper)) を使用します。
{
DataGrid2.DataSource = データリーダー;
DataGrid2.DataBind();
}
}
}