アーカイブ

Archive for 2007年1月

レンタルサーバ上でSQLスクリプトを実行する

2007年1月12日 コメントを残す

Tip/Trick: How to upload a .SQL file to a Hoster and Execute it to Deploy a SQL Database

レンタルサーバ上でSQL文を実行させ、データベースを構築するための方法が記述されています。
ここで紹介されているツール(RunSQL.aspx)のソースを見ればすぐわかりますが、指定したファイルを読み込んでExecuteNonQueryで実行する、という仕組みです。

#そうか、この手があったか。

カテゴリー:.NET

GridViewで削除フラグを持つテーブルをDataSourceから利用する

ASP.NET 2.0ではGridViewやDetailsViewとSqlDataSourceやObjectDataSourceを組み合わせることでコーディングを行わなくても基本的なデータの操作を行えるページを作成することができるようになりました。このようにして作成されるページでデータの削除を行うと、データベースにあるデータそのものが削除されてしまいます。しかし、実際の業務システムにおいてはデータの削除というのはテーブル上の削除フラグを立てるだけ、という場合のほうがむしろ多いのではないでしょうか。
この記事では削除フラグを持つテーブルを操作するページの作成方法を、SqlDataSourceを利用する場合とデータセットとObjectDataSourceを利用する場合の例をあげて説明します。

○テーブルの準備

サンプルを作成するために、以下のようなテーブルを用意しました。

1

○SqlDataSourceを利用するデータ操作ページの作成

データソースの作成ウィザードでデータベースからデータを取得する方法として「カスタムSQLステートメントまたはストアドプロシージャを指定する」を選択します。これにより、SELECT、UPDATE、INSERT、DELETEそれぞれの実行時のSQL文を自由に指定することができるようになります。それぞれ以下のようなSQL文を設定します。

・SELECT

SELECT id, userName FROM userTable WHERE (delflg = 0)

・UPDATE

 UPDATE userTable SET userName = @userName, delflg = 0 WHERE (id = @id)

・INSERT

INSERT INTO userTable(userName, delflg) VALUES (@userName, 0)

・DELETE

UPDATE userTable SET delflg = 1 WHERE (id = @id)

SqlDataSourceを利用するために必要なパラメータは上記のSQL文から自動的に生成されます。GridViewの削除ボタンを有効に設定すると、期待したとおりの動作をしてくれます。

○ObjectDataSourceを利用するデータ操作ページの作成

まずObjectDataSourceで利用するデータセットを追加します。このデータセットには以下のSQL文を使ってデータを読み込むよう設定します。

 SELECT id, userName, delflg FROM userTable WHERE (delflg = 0)

GridViewには上記で作成したデータセットをObjectDataSourceを通して関連付けます。また、列を編集し、delflg列を表示しないよう削除しておきます。
aspxページのソースを表示し、ObjectDataSourceのDeleteMethodの値を"Delete"から"Update"に書き換えます。これで削除ボタンを押したときにUpdateメソッドが呼ばれるようになります。Updateメソッドで必要とされるパラメータがきちんと渡せるように、DeleteParametersの内容をUpdateParametersと同じに修正します。

   <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" DeleteMethod="Update"
       InsertMethod="Insert" OldValuesParameterFormatString="original_{0}" SelectMethod="GetData"
       TypeName="DataSet1TableAdapters.userTableTableAdapter" UpdateMethod="Update">
       <DeleteParameters>
           <asp:Parameter Name="userName" Type="String" />
           <asp:Parameter Name="delflg" Type="Boolean" />
           <asp:Parameter Name="Original_id" Type="Int32" />
           <asp:Parameter Name="id" Type="Int32" />
       </DeleteParameters>
       <UpdateParameters>
           <asp:Parameter Name="userName" Type="String" />
           <asp:Parameter Name="delflg" Type="Boolean" />
           <asp:Parameter Name="Original_id" Type="Int32" />
           <asp:Parameter Name="id" Type="Int32" />
       </UpdateParameters>

DeleteParametersを書き換えたため、このままではデータの削除時に必要なパラメータで渡されないものがでてきてしまいます。それを防ぐためGridViewのRowDeletingイベントに以下のように処理を追加します。

    protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {
        ObjectDataSource1.DeleteParameters["userName"].DefaultValue = e.Values["userName"].ToString();
        ObjectDataSource1.DeleteParameters["delflg"].DefaultValue = "true";
    }

このように修正を行うことで、GridViewの削除ボタンを押したときにデータセットのUpdateメソッドが呼び出され、delflgがtrueに設定される(データの表示が削除される)ことになります。
修正の内容が直感的ではないですが、aspxに記述されている設定がどういう意味を持つかという視点でじっくり考えてみると何をやっているかわかってもらえるのではないかと思います。

カテゴリー:.NET, ASP.NET 備忘録