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 にドラッグします。

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

[データソースの構成ウィザード]が始まります。

ここでは、データ接続の作成で作成した接続を選択します。
[アプリケーション構成ファイルに接続文字列を保存する]画面が出てきます。

特に理由が無ければ、保存しておきましょう。上記画面の例ですと、プログラム内で、
ConfigurationManager.ConnectionStrings プロパティ を介しての参照が可能になります。
[Select ステートメントの構成]画面が出てきます。

Customers テーブルの全項目を選択することにします。
[テーブルまたはビューから列を指定します]を選択し、[コンピュータ]ドロップダウンリストで、Customers を選択し、
列のチェックボックスの中の * 以外の全項目にチェックを入れます。
[詳細設定]ボタンを押下すると、[SQL 生成の詳細オプション]画面が出てきます。
[INSERT UPDATE、および DELETE ステートメントの生成]にチェックを入れます。
※この前の、[Select ステートメントの構成]画面で主キーフィールドが 列として選択されていないと、チェックできません。
[オプティミスティック実行制御]も必要であればチェックを入れます。
※オプティミスティック実行制御については参考資料を参照下さい。

[OK]ボタンを押下し、[Select ステートメントの構成]画面で[次へ]ボタンを押下します。
[クエリのテスト]画面が表示されます。

[クエリのテスト]ボタンを押下し、自分の望む結果が取得できているかを確認します。
[完了]ボタンを押下します。
SqlDataSource の設定は終わりです。
■Web Page に GridView を配置し、SqlDataSource を紐付ける
ソリューション エクスプローラ にある Default.aspx に、コントロールを配置します。
ツールボックス(表示されていない場合は、メニューバーの[表示]→[ツールボックス]をクリックして表示させてくださいね)の
[データ]タブの中にある、GridView を、デザイナ上の Web Page にドラッグします。

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

選択するとこのようになります。

■コードを入力
今回はコードビハインド(Default.aspx.vb)にコードを書く必要はありません。
ちなみに、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 を右クリックして、[スタート ページに設定]をポイントします。
メニューバーの[デバッグ]→[デバッグ開始]をクリックして実行します。
↓こんな画面が出現しましたか?

上記の通りに動作すれば大成功です。