次の方法で共有


第 1 回 ADO.NET プログラミングの基本

~ SQL Server にアクセスしてみよう! - ADO.NET プログラミングにチャレンジ!! - ~

NEC

Eラーニング事業部

i_msproducer.gif 山崎 明子 (このストリーミングはブロードバンド対応です。それ以外の環境からご利用の場合、快適にご覧いただけないことがあります。)

2003 年 4 月 3 日

目次

1. まずは作ってみよう! 1. まずは作ってみよう!
2. ページの表示を切り替えてみよう! 2. ページの表示を切り替えてみよう!
3. どんな仕組み? 3. どんな仕組み?
まとめ ~さまざまなデータアクセスプログラミング~ まとめ ~さまざまなデータアクセスプログラミング~
ワンポイントレッスン! (定義とインスタンス) ワンポイントレッスン! (定義とインスタンス)
ワンポイントレッスン! (SQL Server のセキュリティ設定) ワンポイントレッスン! (SQL Server のセキュリティ設定)

1. まずは作ってみよう!

まずは、SQL Server にアクセスする簡単な ASP.NET Web アプリケーションを作成して、データアクセスのイメージをつかみます。

データアクセスアプリケーションの方法はいろいろありますが、今回ご紹介する方法は、「オブジェクトを活用し、もっとも少ないコードでアプリケーションを実現する」というものです。では、早速作成してみましょう。是非、みなさんも実際にアプリケーションを作ってみてください。やはり作ってみることで、イメージも沸き、理解しやすくなりますし、その開発のしやすさを実感していただけると思います。

※ここでは、ローカルマシンに SQL Server 2000 (または7.0) がインストールされていることを想定しています。

ADO.NET アプリケーション作成デモ

Producer100K.gif

(このストリーミングはブロードバンド対応です。それ以外の環境からご利用の場合、快適にご覧いただけないことがあります。)

(1) プロジェクトの作成

Visual Studio .NET を起動し、新しいプロジェクトを作成します。

Step 1

[ファイル]-[新規作成]-[プロジェクト] を選択します。

Step 2

表示される [新しいプロジェクト] ダイアログで、

- プロジェクトの種類:[VB プロジェクト]
- テンプレート:[ASP.NET Web アプリケーション]

- 場所:「https://localhost/MyADONETDemo」(任意)

をそれぞれ選択、または入力し、[OK] ボタンをクリックします。

(2) データアダプタの構成

ツールボックスのデータカテゴリにある SqlDataAdapter をフォームにドラッグ & ドロップします。すると「データアダプタ構成ウィザード」が開きますので、このウィザードで、接続先データソースと取得するデータを指定します。

Step 1

「データアダプタ構成ウィザードへようこそ」ダイアログで [OK] ボタンをクリックします。

(3)接続先の指定

次に、どのデータベースからデータを取得するかを指定します。

Step 1

[新しい接続] ボタンをクリックします。

Step 2

[データリンクプロパティ] ダイアログの [接続] ページで、

- サーバー名:「サーバー名」または、「(local)」

- ログオンに必要な情報:「Windows NT の統合セキュリティを利用する」

- データベース:pubs (pubs は SQL Server のサンプルデータベースです。)

をそれぞれ選択、または入力します(図 1-1)。

ADONET1_fig1.gif

1-1 データリンクプロパティダイアログ

Step 3

[接続のテスト] ボタンで接続できることを確認し、[OK] ボタンをクリックします。

※ここで接続ができない場合は、データベース管理者にアクセス権などを確認します。

Step 4

[データ接続の選択] ダイアログで [次へ] をクリックします。

(4) 取得するデータの指定

次に、データベースの中のどのデータを取得するかを指定します。クエリを指定したり、ストアドプロシージャを作成したり選択したりすることができます。ここでは、クエリを作成します。

Step 1

[SQL ステートメントの使用] が選択されていることを確認し、[次へ] をクリックします。

Step 2

SQL ステートメントの生成ページで、直接、有効な SELECT ステートメントを入力する (Step 2-A) か、または「クエリビルダ」 (Step 2-B) を利用します。

Step 2-A
SELECT au_id, au_lname, au_fname, phone FROM authors

と入力し、[次へ]をクリックします。

Step 2-B

2-A に代わるもうひとつの方法は、次の通りです。

  1. [クエリビルダ] ボタンをクリックします。

  2. 表示されるテーブルの追加ダイアログで、「authors」テーブルを選択し、[追加] ボタンをクリックし、[閉じる] をクリックします。

  3. [クエリビルダ] ダイアログの authors テーブルから、フィールド名をクリックします。ここで、チェックしたフィールドを取得することができます。ここでは、

    au_id

    au_lname

    au_fname

    phone

    をチェックし(図 1-2)、[OK] をクリックします。

    ADONET1_fig2.gif

    1-2 クエリビルダ

  4. Step 2-A と同様の SELECT ステートメントが生成されていることを確認し、[次へ] をクリックします。

Step 3

[ウィザードの結果の表示] ページ (図1-3) で [完了] をクリックします。

ADONET1_fig3.gif

1-3 データアダプタ構成ウィザード : ウィザードの結果表示画面

(5) データセットの定義

ここでは、「取得したデータをクライアント側で保持するためのオブジェクト」として利用する、データセットを定義します。

Step 1

[データ]-[データセットの生成] メニューを選択し、表示される [データセットの生成] ダイアログで、[データセットの選択] で、新しいデータセットの名前として、「MyDS」と入力します (図 1-4)。[データセットに追加するテーブルの選択] および [このデータセットをデザイナに追加する] がチェックされていることを確認し、OK をクリックします。

フォームの下方に MyDS の最初のインスタンスである「MyDS1」が生成されていることを確認します。

ADONET1_fig4.gif

1-4 データセットの生成ダイアログ

ワンポイントレッスン! (定義とインスタンス)

(6) DataGrid の設定

データを表示するために、DataGrid を利用します。DataGrid を利用すると、取得したデータを表形式で表示できます。

Step 1

ツールボックスの「Web フォーム」カテゴリの中から、「DataGrid」をフォーム上に適当な大きさで配置します。

Step 2

表示するデータの選択をするため、フォーム上で DataGrid1 を右クリックして表示されるメニューから [プロパティビルダ] をクリックします。

表示される [DataGrid1 プロパティ] ダイアログの各ページでそれぞれ次のように設定します。

  1. [全般] ページ (図 1-5) で、データソース、データメンバを選択します。

    (例).

    データソース:MyDS1

    データメンバ:authors

    ADONET1_fig5.gif

    1-5 DataGrid1 プロパティ : 「全般」ページ

  2. [列] ページでは、表示する列を指定したり、列のヘッダーテキストなどを指定できます (図 1-6)。

    (例). 特定の列を表示したい場合は、まず、[実行時に自動的に列を作成する] のチェックをはずします。次に、表示したい列を [表示可能な列] のリストから選択し、[>] ボタンをクリックすることで、[選択された列] のリストに追加します。

    ADONET1_fig6.gif

    1-6 DataGrid1 プロパティ : 「列」ページ

  3. [ページング] ページでは、1 ページに表示するページを指定できます (図 1-7)。

    (例). [ページングを許可] にチェックし、[ページ サイズ] に 1 ページに表示したい行数 (例:5) を指定します。

    ADONET1_fig7.gif

    1-7 DataGrid1 プロパティ : 「ページング」ページ

    最後に [OK] をクリックします。

Step 3 (オプション)

カラフルな見た目を簡単に実現できます。フォーム上で DataGrid1 を右クリックして表示されるメニューから [自動フォーマット] をクリックします。表示される [自動フォーマット] ダイアログ (図 1-8) の [スキームの選択] で、任意のフォーマットを選択します。

ADONET1_fig8.gif

1-8 自動フォーマットダイアログ

ここまでで、図 1-9 のようになります (Step 3 によって多少見た目が異なります)。

ADONET1_fig9.gif

1-9 フォームデザイナで確認

(7) コーディング

ページが表示されたときやページが移動したときに、データが表示されるためのコードを追加します。

Step 1

ページがロードされたときの処理 (イベントハンドラ=イベントが発生したときに実行されるコード) を追加します。

フォームをダブルクリックして表示される、コードエディタで

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' ページを初期化する ユーザー コードをここに挿入します。
    End Sub 

という記述を探します。

Step2

次のようにコードを追加します。

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    If IsPostBack = False Then '最初にページが呼び出されたときだけの処理
        SqlDataAdapter1.Fill(MyDS1)    'データセットにデータを読み込む
        DataGrid1.DataBind()    'データをグリッドに反映させる
    End If
End Sub
 

(8) 作成したアプリケーションの動作確認 (その 1)

ページをビルドし、実行します (図 1-10)。

Step 1

指定したデータの最初の 5 件が表示されたことと、フィールド名が指定した通りになっていることを確認できます。

Step 2

この時点では、表示されるページを切り替えたとき (=グリッド下部の数値をクリックしたとき) に、データの表示が変化しないことを確認します。

ADONET1_fig10.gif

1-10 動作確認

※ここでうまく実行できない場合、セキュリティの問題が考えられます。 ワンポイントレッスン! (SQL Server のセキュリティ設定) を参考にしてください。

2. ページの表示を切り替えてみよう!

次のページが表示できるようにするために、コードの追加が必要です。なぜなら、すでに行った「ページに表示する行数の設定」では、 (まさに) ページに表示する行数を設定しただけで、実際にページを切り替えるための処理は追加されないからです。(ちなみに、この「ページを切り替えるための処理」は、実現の仕方がいくつもあるため、アプリケーションによって検討が必要です。そのため、もしコードが自動生成されたとしても結局書き直すことになる可能性が高いのです。)

(1) コードの追加

ページ切り替えのためのコードを追加します。

Step 1

コードエディタの左上のリストから、「DataGrid1」を選択します。次に右上のリストから [PageIndexChanged] を選択します。

すると、

Private Sub DataGrid1_PageIndexChanged(ByVal source As Object,  _
	ByVal e As System.Web.UI.WebControls.DataGridPageChangedEventArgs) Handles 
End Sub

という記述が生成されますので、次のようにコードを追加します。

Private Sub DataGrid1_PageIndexChanged(ByVal source As Object,  _
  ByVal e As System.Web.UI.WebControls.DataGridPageChangedEventArgs) Handles DataGrid1.PageIndexChanged
    SqlDataAdapter1.Fill(MyDS1)    'データセットにデータを読み込む
    DataGrid1.CurrentPageIndex = e.NewPageIndex    '選択されたページをグリッドの現在のページにする
    DataGrid1.DataBind()    'データをグリッドに反映させる
End Sub

このコードは、ユーザーが UI からページを切り替えたとき、それをグリッドのページとして設定し、さらに DataGrid1 コントロールに反映するというコードです。

(9) 作成したアプリケーションの動作確認

ページをビルドし、実行します (図 1-10)。

Step 1

指定したデータの最初の 5 件が表示されたこと、フィールド名が指定した通りになっていることを確認できます。

Step 2

ページを切り替えたときにデータも適切に切り替わることが確認できます。また、最終ページでは、それより先へは進めないようになっていることなども確認しましょう。

ADONET1_fig10.gif

1-10 動作確認

3. どんな仕組み?

1-1 で作成したアプリケーションを題材に、ADO.NET プログラムでなにが実現されたか、その仕組みを解説します。

先程のアプリケーションでいくつか気になるところはありませんか?

たとえば、

  • データベースへの接続はどのタイミングで行われているのだろうか?

  • そして切断はいつだろうか?

  • 取得したデータはいつまで保持されているのだろうか?

  • 取得したデータの再利用は可能だろうか?

    などなど....

    その疑問を解決していきましょう。

(1) ASP.NET アプリケーションからのデータアクセス

今回は、ASP.NET アプリケーションから SQL Server にアクセスしました。つまり、次のようになっています (図 1-11)。

  1. ユーザーがブラウザから URL を指定すると、ASP.NET アプリケーションが実行され、Web サーバーからデータベースにアクセスします。

    今回は、Web サーバーとデータベースサーバーが同一であるという設定ですので、実際の Web システムは次のように Web サーバーとデータベースサーバーが異なることが一般的です。

  2. アクセスして得られたデータを Grid コントロールなどにバインドします。

    DataBind メソッドなどを利用して、一連のデータを 1 つのメソッドで関連付けできます。

  3. データアクセスの結果は、HTML としてブラウザに送信されます。

    これを確認する方法は、結果が表示されたブラウザで「ソース表示」を行ってみます。すると、VB.NET コードは確認できずに、結果を表示するための HTML とクライアントサイドスクリプト (JavaScript) のみを確認することができます。

ADONET1_fig10.gif

1-11 データの取得~表示

(2) データ接続

ここでは、SQLConnection オブジェクトと Windows 認証を利用しています。なぜ、SQL Connection を利用しているかというと、アクセスしたいデータが SQL Server だからです。では、異なるデータの場合は?もっと詳しく知りたい!という方は、次回のコラムを参照してください。

ここで注目しておきたいことは、1-1 で作成したアプリケーションには、今までのデータアクセスプログラミング (ADO、RDO、DAO など) では必ず行った Open メソッドの実行 (=データベースとの接続) と Close メソッドの実行 (切断) のコードが見当たらないことです。もちろん、データに接続しなければ、データにはアクセスできませんので、もちろん接続と切断は、おこなわれています。しかし、そのコーディングは今回は含まれていません。それはいったいいつ?どこで?その答えは、、、次の (4) で解説します。

(3) データセット

このアプリケーションのポイントはデータセットを利用していることです。ちなみにデータセットは、データを格納するためのオブジェクトです (実際には、ただ格納するだけでなく、実にさまざまな機能を提供するのですが、それはおいおい...)。

このデータセットは、あらかじめどのようなデータを格納するかを定義しておくことも、また、定義せずに利用することもできます。あらかじめデータの型を定義することで、

  • プログラミングが容易になる

  • 型チェックができるため堅牢なアプリケーションになる

という利点があります。この詳細は、データセットの回にじっくり扱う予定です。

(4) データアダプタ

(3) で解説した「データセット」にデータを格納する役割を果たしているのが、データアダプタです。また、データセットに対しておこなった変更を元にデータベースに変更を反映するという機能も持ちます。

つまり、データソースとデータセットの橋渡しの役割を果たします。

このアプリケーションでは、データアダプタの Fill メソッドがデータソースからデータを読み込んでいます。この Fill メソッドのタイミングで行われることは、データの読み込みだけではありません。実は、このとき、データソースに接続、データの読み込み、そして切断を行っているのです。これによって、もっとも貴重なリソースであるデータ接続を適切に扱う、つまり「使う直前にデータソースに接続し、使い終わったらすぐに切断するというプログラム」を自動的に作成できるのです。

※ここで、「同じデータに何度もアクセスする場合、そのような利用は無駄なのでは?」と思われた方もいらっしゃると思います。実はそのために、接続リソースをプーリングするという機能を活用できます。詳細は次回のコラムを是非ご覧ください!

(5) データ連結コントロール

データソースと連結し、データを表示することができるコントロールのことを総称してデータ連結コントロールといいます。(データ連結コントロールという名前のコントロールが、ひとつ存在するわけではありません、念のため。) 今回利用したデータグリッドコントロールのように、一連のデータと連結して表やリストでデータを表示する機能を持つコントロールがマルチレコード連結コントロールです。

このデータ連結コントロールでは、データソース (データセット) やデータメンバ (データセット内の特定のデータ) を指定することで、そのデータを表示することができます (図 1-12)。

また、データ連結 Web コントロールの場合、DataBind というメソッドを利用すると、関連付けられた一連のデータを連結コントロールに反映させることができます。そのため、ループなどを利用して一つ一つデータの関連付けを行う、という手間が省けます。

なお、単純にデータの特定の列のひとつのデータなどと連結するコントロールは単一値連結コントロールといい、Label コントロールや TextBox コントロールなどがそれにあたります。この場合は表示したいデータを取得しその値を TextBox コントロールなどの Text プロパティに代入したり、Eval メソッドを利用したりすることができます。

ADONET1_fig12.gif

1-12 データ連結コーンとロール

まとめ ~さまざまなデータアクセスプログラミング~

今回は、ツールボックスにあるオブジェクトや Visual Studio .NET が提供しているメニューやツールをできるだけ活用したアプリケーションを作成しました。また、サーバーエクスプローラを利用すると、SQL Server のデータ構造やデータなどにアクセスすることができます。

サーバーエクスプローラの利用

Producer100K.gif

(このストリーミングはブロードバンド対応です。それ以外の環境からご利用の場合、快適にご覧いただけないことがあります。)

それ以外にも、ツールボックスにあるオブジェクトやツールを利用せず、オブジェクトをコーディングで生成 (new) することもできます。

また、今回紹介したアプリケーションでは、DataSet を利用しました。それにより、プロパティビルダなどを活用することができ、コーディング量を減らすことができました。しかし、実際には、その開発の生産性よりも実行時のメモリを重要視することが多いため、DataSet を利用しない別の方法でデータを取得、表示することもあります。今後の連載では、

  • コードを活用したデータアクセス

  • データセットを利用しないデータアクセス

  • データセットのより高度な使い方

など、さまざまな ADO.NET の機能を紹介していきます。

次回は、DataProvider についてご紹介します。

ワンポイントレッスン! (定義とインスタンス)

MyDataSet はデータセットの「定義」で、MyDataSet1 は「インスタンス (実体) 」です。ここでいっている「定義」とは、インスタンス (実体) の設計図のようなものです (図 1-13)。

ADONET1_fig13.gif

1-13 定義とインスタンスのイメージ図 ( 例:青写真と実際の家 )

たとえば、家を建てるときに設計図が必要です、そしてその設計図を元に家が作られます。設計図がないと家は建てられませんが、一方設計図だけがあっても家の実体がなければ、住むことができません。それと同じです。

まず、このデータセットにどのようなデータを入れるかという設計図 (ここでは、MyDS) をつくります。そして、その設計図に基づいて実体 (ここでは、MyDS1) を作成しなければ、それをプログラム中で利用することができません。[データセットの生成] ダイアログでは、この「定義 (設計図)」を作成することができます。また、このダイアログで、「このデータセットをデザイナに追加する」にチェックがついていると、「インスタンス (実体)」も生成されるのです。

1. (5) 「データセットの定義」へ戻る

ワンポイントレッスン! (SQL Server のセキュリティ設定)

pubsデータベースにアクセスするためには、このデータに対するアクセス許可が必要です。実行時に、「ASPNET はログインできませんでした」とブラウザに表示された場合、セキュリティの設定を変更する必要があります。

今回作成したアプリケーションは、ASP.NET のアプリケーションですので、デフォルトでは「ASPNET」というユーザーで実行されます。そこで、この「ASPNET」ユーザから「pubs」データベースを利用できるように設定しておく必要があります。

Step 1

「ASPNET」ユーザーに対して、Windows 認証を使用して SQL Server に接続することを許可します。そのための方法として、クエリを実行する方法 (Step 1-A) と、GUI ベースで作成する方法 (Step 1-B) などがあります。

Step 1-A

クエリアナライザを利用して、次のコードを実行します。

execute ('sp_grantlogin ' + '''' +@@servername + '\ASPNET'+ '''')

※「''''」はシングルクォーテーションを 4 つ入力します。

Step 1-B

SQL Server Enterprise Manager の [Microsoft SQL Server]-[SQL Server グループ]-[(local)]-[セキュリティ]-[ログイン] を右クリックします。表示されるメニューから [新規ログイン...] をクリックし、表示されるダイアログで次のように設定します。

名前:ASPNET
ドメイン:サーバー名

[OK]をクリックします。

※ログインの追加に関する詳細情報は、MSDN オンラインを参照してください。

https://msdn2.microsoft.com/en-us/library/aa905177(SQL.80).aspx

※ここで紹介しているのは、IIS5.0 の場合です。なお、IIS6.0 の場合 ASP.NET アプリケーションを実行するユーザーのデフォルトは、「ASPNET」ではなく、「Network Service」であるなどの変更があります。別途 MSDN オンラインを参考にしてください。

1. (8) 「作成したアプリケーションの確認」へ戻る