| 2003年9月11日
『どっとねっとと雑多な日々 11』
Blaster 騒ぎは考えさせられることがいっぱいありました。とりあえず、収束はしてきましたが CodeRed と同じで完全に消え去るにはしばらくかかると思いますので、マシンを新規導入するときや再インストールするときは十分注意してください。
さて、今回はやっと ASP から ASP.NET に移行するときの FAQ 的なものを書きたいと思います。
※PASSJ ということなので、データベースに関する部分について特化して書きます。
ASP が逐次実行型のプログラムモデルだというのは、皆さんご存知の通りです。ASP.NET はイベントドリブン型のプログラムモデルに変更されています。
※以前の ASP と同じように動作させることも可能ではあります。
両者のプログラムモデルが大きく違うものをどうやって移植するのかはいろいろ方法があると思います。
大きく分けて、
1.すべて再設計を行い、1 から作り直す
2.できるだけ再利用しながら、移植する
この 2 点に分けられると思います。
1. についてはオブジェクト指向を理解し、ASP.NET のプログラムモデルを理解すれば、きれいなアプリケーションが作成できるでしょう。しかし、それなりのスキルが必要になるし、再設計するので時間がかかります。ここで解説できるだけの分量ではないので、今回はパスします。
では、 2. について、どのような方法があるのでしょうか?プログラムソースを紐解いて、いちいち移植していくというものでしょうか?その答えはノーだと思います。
ASP のソースがあるということは、実際に動くソースがあるということですので、動かしながらの移植になると思います。
ASP で一番難解なのが、ADODB.Recordset を使い、ループをまわしながら <table> を生成していく部分でしょう。しかし、ASP.NET
では、DataSet と DataGrid という強力なコンポーネントがありますので、すべてこれに置き換えていきます。
たとえば、こんなソースがあった場合
-- Test.asp --
Dim objADORecordset
Set objADORecordset = Server.CreateObject("ADODB.Recordset")
With objADORecordset
.ActiveConnection = objADOConnection
.CursorLocation = 2
.CursorType = 1
.LockType = 1
.Source = "SELECT * FROM title"
.Open
End With
%><table>
<tr><th>title</th></tr>
<%
Do Until objADORecordset.EOF
%><tr><td><% = objADORecrodset.Fields("title").Value
%></td></tr>
<%
objADORecordset.MoveNext
Loop
%></table>
<%
objADORecordset.Close
Set objADORecordset = Nothing
%>
-- Test.asp --
この場合、着目してほしいのが Source で指定している SQL 文です。ASP.NET の DataSet と DataGrid
に移植する場合でも、この SQL は使えます。ADODB.Connection の部分は SqlConnection に置き換えます。ADODB.Recordset
はすっかり削除して、SqlCommand、SqlDataAdapter、DataSetに置き換えます。
デザインは ASP を実行した HTML をソース表示で取得して、ASP.NET に反映します。このとき、ループをまわしている部分(<table>
生成)は削除して、DataGridコントロールに置き換えます。
これらの作業を行うと ASP.NET への移植は完了です。
ASP から移植した ASP.NET のサンプルソースは下記の通りです。
-- Test.aspx --
<%@ Page language="c#" Codebehind="titles.aspx.cs"
AutoEventWireup="false"
Inherits="Test.titles" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
>
<HTML>
<HEAD>
<title>titles</title>
<meta name="GENERATOR" Content="Microsoft Visual
Studio .NET 7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<asp:DataGrid id="DataGrid1" style="Z-INDEX:
101; LEFT: 32px; POSITION: absolute; TOP: 32px" runat="server"
AutoGenerateColumns="False">
<Columns>
<asp:BoundColumn DataField="title" HeaderText="タイトル"></asp:BoundColumn>
</Columns>
</asp:DataGrid>
</form>
</body>
</HTML>
-- Test.aspx --
-- Test.aspx.cs --
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace Test
{
/// <summary>
/// titles の概要の説明です。
/// </summary>
public class titles : System.Web.UI.Page
{
protected System.Web.UI.WebControls.DataGrid DataGrid1;
private void Page_Load(object sender, System.EventArgs e)
{
// ページを初期化するユーザー コードをここに挿入します。
if(!Page.IsPostBack)
{
using(SqlConnection sc = new SqlConnection("Data Source=(local);Initial
Catalog=pubs;Trusted_Connection=yes;"))
using(SqlCommand scd = new SqlCommand("SELECT * FROM titles",
sc))
using(SqlDataAdapter sda = new SqlDataAdapter(scd))
using(DataSet ds = new DataSet("Titles"))
{
try
{
sc.Open();
sda.Fill(ds);
this.DataGrid1.DataSource = ds.Tables[0].DefaultView;
this.DataGrid1.DataBind();
sc.Close();
}
catch(SqlException se)
{
System.Diagnostics.Debug.WriteLine(se.Message);
}
}
}
}
#region Web フォーム デザイナで生成されたコード
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: この呼び出しは、ASP.NET Web フォーム デザイナで必要です。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// デザイナ サポートに必要なメソッドです。このメソッドの内容を
/// コード エディタで変更しないでください。
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}
-- Test.aspx.cs --
後は、クライアント側で動作している JavaScript などをサーバサイドで動かすのか、クライアント側で動かすのかを決定して、それぞれ移植していけば、ほぼ完成です。
結論としては、ADODB.Recordset でループをまわしている部分は DataGrid に移植すれば、制御処理を書かずに同じようなことが可能ですので、ぜひ利用してみてください。
|