Web アプリケーション (ASP.NET) でDBのデータを表示しよう(VS2005 SqlDataSource 編)

VS2005 TableAdapter 編 につづいて、VS2005 の SqlDataSource を使って、DataBase へのアクセスします。
こちらで最終的に実現したい事は、VS2003 DataAdapter 編 や VS2005 TableAdapter 編 とほぼ同じです。
※解説に用いた Visual Studio 2005 の Edition は、Team System Edition です。
サンプルのダウンロード

このカテゴリーの先頭へ このページの先頭へ

■プロジェクトの作成

プロジェクトの作成についてはWeb アプリケーション (ASP.NET) を作ってみようと 全く同じなのでここでは割愛します。
※今回は、プロジェクト名を MyWebDBApp03 としました。

このカテゴリーの先頭へ このページの先頭へ

■データ接続の作成

データ接続の作成 についてはVS2005 TableAdapter 編と 全く同じなのでここでは割愛します。

このカテゴリーの先頭へ このページの先頭へ

■SqlDataSource の作成

ツールボックス(表示されていない場合は、メニューバーの[表示]→[ツールボックス]をクリックして表示させてくださいね)の
[データ]タブの中にある、SqlDataSource を、デザイナ上の Web Page にドラッグします。
SqlDataSource の作成

Web Page 上に配置された SqlDataSource の右上端にある、三角のボタンをクリックすると、
データ ソースの構成というリンクが表示されますので、そのリンクをクリックします。
SqlDataSource の作成

[データソースの構成ウィザード]が始まります。
データ 接続の選択
ここでは、データ接続の作成で作成した接続を選択します。

[アプリケーション構成ファイルに接続文字列を保存する]画面が出てきます。
接続文字列
特に理由が無ければ、保存しておきましょう。上記画面の例ですと、プログラム内で、
ConfigurationManager.ConnectionStrings プロパティ を介しての参照が可能になります。

[Select ステートメントの構成]画面が出てきます。
Select ステートメントの構成
Customers テーブルの全項目を選択することにします。
[テーブルまたはビューから列を指定します]を選択し、[コンピュータ]ドロップダウンリストで、Customers を選択し、
列のチェックボックスの中の * 以外の全項目にチェックを入れます。

[詳細設定]ボタンを押下すると、[SQL 生成の詳細オプション]画面が出てきます。
[INSERT UPDATE、および DELETE ステートメントの生成]にチェックを入れます。
※この前の、[Select ステートメントの構成]画面で主キーフィールドが 列として選択されていないと、チェックできません。
[オプティミスティック実行制御]も必要であればチェックを入れます。
※オプティミスティック実行制御については参考資料を参照下さい。
SQL 生成の詳細オプション
[OK]ボタンを押下し、[Select ステートメントの構成]画面で[次へ]ボタンを押下します。

[クエリのテスト]画面が表示されます。
クエリのテスト
[クエリのテスト]ボタンを押下し、自分の望む結果が取得できているかを確認します。
[完了]ボタンを押下します。

SqlDataSource の設定は終わりです。

このカテゴリーの先頭へ このページの先頭へ

■Web Page に GridView を配置し、SqlDataSource を紐付ける

ソリューション エクスプローラ にある Default.aspx に、コントロールを配置します。
ツールボックス(表示されていない場合は、メニューバーの[表示]→[ツールボックス]をクリックして表示させてくださいね)の
[データ]タブの中にある、GridView を、デザイナ上の Web Page にドラッグします。
ツールボックス→GridView

GridView の 右上端にある、三角のボタンをクリックすると、
データソースの選択 というドロップダウンリストが表示されますので、
SqlDataSource の作成で作成した SqlDataSource を選択します。
データソースの選択

選択するとこのようになります。
データソースを選択後

このカテゴリーの先頭へ このページの先頭へ

■コードを入力

今回はコードビハインド(Default.aspx.vb)にコードを書く必要はありません。
ちなみに、Default.aspx は以下の様になっているはずです。

Default.aspx
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>無題のページ</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConflictDetection="CompareAllValues"
            ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" DeleteCommand="DELETE FROM [Customers] WHERE [CustomerID] = @original_CustomerID AND [CompanyName] = @original_CompanyName AND [ContactName] = @original_ContactName AND [City] = @original_City AND [Region] = @original_Region AND [PostalCode] = @original_PostalCode AND [Country] = @original_Country AND [Phone] = @original_Phone AND [Fax] = @original_Fax AND [ContactTitle] = @original_ContactTitle AND [Address] = @original_Address"
            InsertCommand="INSERT INTO [Customers] ([CustomerID], [CompanyName], [ContactName], [City], [Region], [PostalCode], [Country], [Phone], [Fax], [ContactTitle], [Address]) VALUES (@CustomerID, @CompanyName, @ContactName, @City, @Region, @PostalCode, @Country, @Phone, @Fax, @ContactTitle, @Address)"
            OldValuesParameterFormatString="original_{0}" SelectCommand="SELECT [CustomerID], [CompanyName], [ContactName], [City], [Region], [PostalCode], [Country], [Phone], [Fax], [ContactTitle], [Address] FROM [Customers]"
            UpdateCommand="UPDATE [Customers] SET [CompanyName] = @CompanyName, [ContactName] = @ContactName, [City] = @City, [Region] = @Region, [PostalCode] = @PostalCode, [Country] = @Country, [Phone] = @Phone, [Fax] = @Fax, [ContactTitle] = @ContactTitle, [Address] = @Address WHERE [CustomerID] = @original_CustomerID AND [CompanyName] = @original_CompanyName AND [ContactName] = @original_ContactName AND [City] = @original_City AND [Region] = @original_Region AND [PostalCode] = @original_PostalCode AND [Country] = @original_Country AND [Phone] = @original_Phone AND [Fax] = @original_Fax AND [ContactTitle] = @original_ContactTitle AND [Address] = @original_Address">
            <DeleteParameters>
                <asp:Parameter Name="original_CustomerID" Type="String" />
                <asp:Parameter Name="original_CompanyName" Type="String" />
                <asp:Parameter Name="original_ContactName" Type="String" />
                <asp:Parameter Name="original_City" Type="String" />
                <asp:Parameter Name="original_Region" Type="String" />
                <asp:Parameter Name="original_PostalCode" Type="String" />
                <asp:Parameter Name="original_Country" Type="String" />
                <asp:Parameter Name="original_Phone" Type="String" />
                <asp:Parameter Name="original_Fax" Type="String" />
                <asp:Parameter Name="original_ContactTitle" Type="String" />
                <asp:Parameter Name="original_Address" Type="String" />
            </DeleteParameters>
            <UpdateParameters>
                <asp:Parameter Name="CompanyName" Type="String" />
                <asp:Parameter Name="ContactName" Type="String" />
                <asp:Parameter Name="City" Type="String" />
                <asp:Parameter Name="Region" Type="String" />
                <asp:Parameter Name="PostalCode" Type="String" />
                <asp:Parameter Name="Country" Type="String" />
                <asp:Parameter Name="Phone" Type="String" />
                <asp:Parameter Name="Fax" Type="String" />
                <asp:Parameter Name="ContactTitle" Type="String" />
                <asp:Parameter Name="Address" Type="String" />
                <asp:Parameter Name="original_CustomerID" Type="String" />
                <asp:Parameter Name="original_CompanyName" Type="String" />
                <asp:Parameter Name="original_ContactName" Type="String" />
                <asp:Parameter Name="original_City" Type="String" />
                <asp:Parameter Name="original_Region" Type="String" />
                <asp:Parameter Name="original_PostalCode" Type="String" />
                <asp:Parameter Name="original_Country" Type="String" />
                <asp:Parameter Name="original_Phone" Type="String" />
                <asp:Parameter Name="original_Fax" Type="String" />
                <asp:Parameter Name="original_ContactTitle" Type="String" />
                <asp:Parameter Name="original_Address" Type="String" />
            </UpdateParameters>
            <InsertParameters>
                <asp:Parameter Name="CustomerID" Type="String" />
                <asp:Parameter Name="CompanyName" Type="String" />
                <asp:Parameter Name="ContactName" Type="String" />
                <asp:Parameter Name="City" Type="String" />
                <asp:Parameter Name="Region" Type="String" />
                <asp:Parameter Name="PostalCode" Type="String" />
                <asp:Parameter Name="Country" Type="String" />
                <asp:Parameter Name="Phone" Type="String" />
                <asp:Parameter Name="Fax" Type="String" />
                <asp:Parameter Name="ContactTitle" Type="String" />
                <asp:Parameter Name="Address" Type="String" />
            </InsertParameters>
        </asp:SqlDataSource>
        </div>
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="CustomerID"
            DataSourceID="SqlDataSource1">
            <Columns>
                <asp:BoundField DataField="CustomerID" HeaderText="CustomerID" ReadOnly="True" SortExpression="CustomerID" />
                <asp:BoundField DataField="CompanyName" HeaderText="CompanyName" SortExpression="CompanyName" />
                <asp:BoundField DataField="ContactName" HeaderText="ContactName" SortExpression="ContactName" />
                <asp:BoundField DataField="City" HeaderText="City" SortExpression="City" />
                <asp:BoundField DataField="Region" HeaderText="Region" SortExpression="Region" />
                <asp:BoundField DataField="PostalCode" HeaderText="PostalCode" SortExpression="PostalCode" />
                <asp:BoundField DataField="Country" HeaderText="Country" SortExpression="Country" />
                <asp:BoundField DataField="Phone" HeaderText="Phone" SortExpression="Phone" />
                <asp:BoundField DataField="Fax" HeaderText="Fax" SortExpression="Fax" />
                <asp:BoundField DataField="ContactTitle" HeaderText="ContactTitle" SortExpression="ContactTitle" />
                <asp:BoundField DataField="Address" HeaderText="Address" SortExpression="Address" />
            </Columns>
        </asp:GridView>
    </form>
</body>
</html>

データ接続を作成する際、SQL Server への認証を「Windows 認証」にしました。
ASP.NET の場合は、実行時に SQL Server へログオンするのは、ASPNET ユーザーになります。
その為、SQL Server にログインする権限がないとエラーが発生します。
ASPNET ユーザーに権限を与える方法もありますが、通常は "偽装" と呼ばれるテクニックを使います。
偽装をする為にもっともポピュラーな方法は、web.config ファイルに以下の一文を追記します。

<identity impersonate="true" userName="SQL Server にアクセスできる権限のあるユーザー名" password="userName に記述したユーザーの Windows ログオンパスワード" />
このカテゴリーの先頭へ このページの先頭へ

■実行しよう!

現在作業した Default.aspx をスタート ページに設定します。
ソリューションエクスプローラ上で、Default.aspx を右クリックして、[スタート ページに設定]をポイントします。

メニューバーの[デバッグ]→[デバッグ開始]をクリックして実行します。
↓こんな画面が出現しましたか?
一覧表示画面
上記の通りに動作すれば大成功です。

このカテゴリーの先頭へ このページの先頭へ

■参考資料

オプティミスティック同時実行制御
SqlDataSource クラス