Web アプリケーション (ASP.NET) でDBを更新してみよう(VS2005 SqlDataSource 編)
実は今回は Web アプリケーション (ASP.NET) でDBのデータを表示しよう(VS2005 SqlDataSource 編) でやった事に
ちょこっと作業を加えるだけです。
※今回は、プロジェクト名を MyWebDBApp06 としました。
※解説に用いた Visual Studio 2005 の Edition は、Team System Edition です。
サンプルのダウンロード
■プロジェクトの作成 〜 Web Page に GridView を配置し、SqlDataSource を紐付ける
Web アプリケーション (ASP.NET) でDBのデータを表示しよう(VS2005 SqlDataSource 編)にて行った事と全く同じ事をします。
プロジェクトの作成
データ接続の作成
SqlDataSource の作成
Web Page に GridView を配置し、SqlDataSource を紐付ける
■GridView のプロパティを編集する
GridView の右上端にある、三角のボタンをクリックすると、列の編集 というリンクがあるので、クリックします。

[使用可能なフィールド] から (すべてのフィールド) または BoundField → 任意の列 を選択し、[追加]ボタンを押下して [選択されたフィールド] に追加します。
選択された列の内、主キー フィールド 以外の列を一つ一つをクリックし、フィールド ダイアログ の下のほうにある [この列を TemplateField に変換します。] というリンクをクリックします。
同様に、ボタン列 → [編集、更新、キャンセル] と [削除] を [選択されたフィールド] に追加します。
[OK]ボタンを押下し、フィールド ダイアログを閉じます。
# [削除]等 を TemplateField に変換し、GridView 右クリック → テンプレートの編集 で、OnClientClick に 確認メッセージを表示する事等もできます。
■コードを入力
今回はコードビハインド(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 [Phone] = @original_Phone AND [Fax] = @original_Fax" InsertCommand="INSERT INTO [Customers] ([CustomerID], [CompanyName], [ContactName], [Phone], [Fax]) VALUES (@CustomerID, @CompanyName, @ContactName, @Phone, @Fax)" OldValuesParameterFormatString="original_{0}" SelectCommand="SELECT [CustomerID], [CompanyName], [ContactName], [Phone], [Fax] FROM [Customers]" UpdateCommand="UPDATE [Customers] SET [CompanyName] = @CompanyName, [ContactName] = @ContactName, [Phone] = @Phone, [Fax] = @Fax WHERE [CustomerID] = @original_CustomerID AND [CompanyName] = @original_CompanyName AND [ContactName] = @original_ContactName AND [Phone] = @original_Phone AND [Fax] = @original_Fax"> <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_Phone" Type="String" /> <asp:Parameter Name="original_Fax" Type="String" /> </DeleteParameters> <UpdateParameters> <asp:Parameter Name="CompanyName" Type="String" /> <asp:Parameter Name="ContactName" Type="String" /> <asp:Parameter Name="Phone" Type="String" /> <asp:Parameter Name="Fax" 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_Phone" Type="String" /> <asp:Parameter Name="original_Fax" 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="Phone" Type="String" /> <asp:Parameter Name="Fax" 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:TemplateField HeaderText="CompanyName" SortExpression="CompanyName"> <EditItemTemplate> <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("CompanyName") %>'></asp:TextBox> </EditItemTemplate> <ItemTemplate> <asp:Label ID="Label1" runat="server" Text='<%# Bind("CompanyName") %>'></asp:Label> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="ContactName" SortExpression="ContactName"> <EditItemTemplate> <asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("ContactName") %>'></asp:TextBox> </EditItemTemplate> <ItemTemplate> <asp:Label ID="Label2" runat="server" Text='<%# Bind("ContactName") %>'></asp:Label> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Phone" SortExpression="Phone"> <EditItemTemplate> <asp:TextBox ID="TextBox3" runat="server" Text='<%# Bind("Phone") %>'></asp:TextBox> </EditItemTemplate> <ItemTemplate> <asp:Label ID="Label3" runat="server" Text='<%# Bind("Phone") %>'></asp:Label> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Fax" SortExpression="Fax"> <EditItemTemplate> <asp:TextBox ID="TextBox4" runat="server" Text='<%# Bind("Fax") %>'></asp:TextBox> </EditItemTemplate> <ItemTemplate> <asp:Label ID="Label4" runat="server" Text='<%# Bind("Fax") %>'></asp:Label> </ItemTemplate> </asp:TemplateField> <asp:CommandField ShowEditButton="True" /> <asp:TemplateField ShowHeader="False"> <ItemTemplate> <asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="False" CommandName="Delete" OnClientClick="return confirm('本当に削除しても良いですか?')" Text="削除"></asp:LinkButton> </ItemTemplate> </asp:TemplateField> </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 ログオンパスワード" />
■実行しよう!
メニューバーの[デバッグ]→[デバッグ開始]をクリックして実行します。
↓こんな画面が出現しましたか?

上のような画面が出現したら、編集→キャンセル・編集→更新・削除と一通りやってみてください。
SQL Server 側の該当テーブルで データの内容が 画面表示と同じになっていれば大成功です。
画面右上の×ボタンをクリックしてプログラムを終了させて下さい。
■ひとこと
ObjectDataSource と非常によく似ています。↓こちらも参考にして下さい。
Web アプリケーション (ASP.NET) でDBを更新してみよう(VS2005 TableAdapter 編)
ただし今回は、ObjectDataSource の時のようにハマることもなかったし、主キーを ReadOnly にしてもバッチし大丈夫で、SQL も一切いじってません。