この特集のトップページへ
Chapter 6:ビジネスロジックの設計



6.2.4 顧客一覧の取得
●データオブジェクトの構築
 説明はこれぐらいにして,顧客一覧を返すメソッドを実際に実装してゆく。まずは,データオブジェクトであるDataObj.Customerコンポーネントに実装する,顧客一覧を返すメソッドから考えてゆくことにする。いままで説明してきたとおり,配列としてデータを返すには次の4つの方法がある。

  1. Variant型として返す

  2. Collectionオブジェクトとして返す

  3. XMLとして返す

  4. ADODB.Recordsetオブジェクトとして返す

 どの方法で実装してもよいのだが,今回は最後に挙げたADODB.Recordsetオブジェクトとして返す方法を採ることにする。ADODB.Recordsetオブジェクトを使うと,サーバー側でCOMオブジェクトが実体化されるため,サーバーのリソースを消費しやすいというデメリットがあるが,その一方でADODB.Recordsetオブジェクトを取得したクライアントは各種のデータ操作をしやすいというメリットがある。たとえば,ADODB.Recordsetオブジェクトには,格納されたデータを並び替えるSortプロパティ,条件に合致するデータを探すFindメソッド,条件を指定してデータをフィルタリングするFilterプロパティなど,データを操作するのに便利なプロパティやメソッドが備わっている。また,ADO 2.5ではADODB.RecordsetオブジェクトからXML形式のテキストを書き出すこともできるため,データを書き出すときや異機種とデータを交換するときにも便利である。サーバーのリソースを消費しやすいというデメリットについては,クライアント側でADODB.Recordsetオブジェクトを取得したら,即座にそれを解放するようにプログラム側で気を遣うことによって対処できる。

 ADODB.Recordsetオブジェクトで顧客一覧を返す場合,その実装は先に示したList 6-45とほぼ同等となる。ここでは,顧客一覧を返すメソッドをGetRecordsメソッドとしてDataObj.Customerコンポーネントに実装するものとする(List 6-50)。

 List 6-50では,引数で削除ずみの顧客を含むかどうかを設定できるようにした。引数にTrueが渡されたときには削除ずみの顧客も含むようにし,Falseが渡されたときには削除ずみの顧客を含まないものを返す。その条件は,24行目にあるSQL文のWHERE句以降の条件式で指定している。

 また,20行目では,データベースにSQL文を発行するとき,“SELECT * FROM ”のように“*”を使って全フィールドを取得するのではなく,“SELECT ID, NAME, YOMIGANA, FROM ”のように個々のレコードを順に明示している点にも注目してほしい。“SELECT * FROM ”のように指定した場合,フィールドが返される順序は一般にテーブルに定義したフィールドの順となる。もし,あとでデータベーステーブルの一部に変更を加えたときには(もちろん,そうならないように慎重にテーブル定義するのが鉄則ではある),返されるフィールドの順番が異なってしまうことになる。また,データベーステーブルの定義を参照しない限り,どのような順序でフィールドが返されるのかを判断することはできず,プログラムの可視性は悪くなる。そのため,“*”ではなく明示的に個々のフィールド名を列挙した。明示的にフィールド名を列挙することで,必ずその順序でフィールドが返されることが保証されるようになる。

 ADODB.Recordsetオブジェクトのデータを取得するには,“ADODB.Recordsetオブジェクト.Fields("フィールド名").Value”とする方法のほかに,“ADODB.Recordsetオブジェクト.Fields(フィールド番号).Value”という具合に配列のように指定して取得する方法の2通りがある。20行目では,“SELECT ID, NAME, YOMIGANA, ”のように指定しているため,ADODB.Recordsetオブジェクト.Fields(0).ValueIDフィールドの値,ADODB.Recordsetオブジェクト.Fields(1).ValueNAMEフィールドの値,……と順に対応する。フィールド名ではなくフィールド番号を使うことで,ADODB.Recordsetオブジェクトに含まれる個々のフィールドをFor文などのループ処理で次々と取得できるため,取得したデータを表形式にして表示するときには都合がよい。もし将来的にフィールドが返される順番が変わってしまうのであれば,フィールド番号とフィールド名との関係がずれることになるため,都合が悪い。そういった意味で,ADODB.Recordsetオブジェクトを通じてデータを返す際には,単にどのテーブルの全データを取得するのかを定義するだけではなく,どのようなフィールドをどの順番で取得するのかも定義しておくことが好ましい。特に,COMコンポーネントを実装する開発者とCOMコンポーネントを使う開発者が異なる場合には,そういった取り決めが重要になるだろう。

prevpg.gif Chapter 6 33/92 nextpg.gif