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 は以下の様になっているはずです。

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 も一切いじってません。