本文へジャンプ

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

送信されたすべての情報は安全です。

  • 閉じる [x]

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


送信されたすべての情報は安全です。

  • 閉じる [x]

DB2 7.2とVisual Basic 6.0 - ADOの連結および非連結フォーム

Essma Hasin (mailto:essma@neneva.com), Visual Basic and C Programmer, Quality Assurance Engineer , Neneva Technologies
Essma Hasinは、Visual BasicおよびC言語の認定プログラマーで、Neneva Technologies社の品質保証エンジニアです。Neneva Technologies社は、IBM DB2 UDBとMicrosoft .NETフレームワークを利用した中小規模の企業向けにカスタム・ソリューションを専門とするコンサルティング会社です。 メール・アドレス:essma@neneva.com

概要: DB2 7.2とVisual Basic 6.0 - ADOの連結および非連結フォーム

日付:  2004年 12月 15日
レベル:  中級
アクティビティー: 2077 ビュー
お気軽にご意見・ご感想をお寄せください: 


はじめに

グラフィック・ユーザー・インターフェース (GUI) 開発者は、Visual Basic 6.0を使用して、IBM DB2®ユニバーサル・データベース (UDB) 7.2に保管されたデータをアクセスするアプリケーションを作成できます。通常、これらのGUIアプリケーションは、Microsoft® ActiveX Data Objects (ADO) を使用してデータを操作します。また、これらは1つ以上のVisual Basic GUIフォームで構成されています。各フォームには、アプリケーション・データの表示や変更を可能にする1つ以上のコントロールがあり、フォーム・コントロールはデータ・ソースに対して連結または非連結のどちらかです。

フォーム・コントロールがアプリケーション・データ・ソースに結合される際、フォーム・コントロール値は自動的にデータ・ソース値と同期化されます。したがって、コントロールに対する変更があれば、自動的にデータ・ソースに反映され、データ・ソースに対する変更も、自動的にコントロールに反映されます。フォーム・コントロールが非連結の場合、コントロール値はプログラム的にデータ・ソース値と同期が保たれる必要があり、その逆も同様です。

この記事は、連結/非連結データ・フォームを使用するDB2アプリケーションの開発方法を説明し、作成するアプリケーションにどちらのタイプのフォームを使用するかについて、ガイダンスを提供します。


サンプル・シナリオ - 作者と本の情報

連結データ・フォーム・コントロールと非連結データ・フォーム・コントロールの実装の違いの説明に、サンプル・フォーム (図1参照) を用います。このサンプル・フォームでは、ユーザーは保管された作者リストから作者を、出版されているその作者の著作リストから本を選択できます。考え方としては、このVisual Basicフォームを使用して、作者(author)と本(book)の両方の情報を表示します。最初に連結フォーム・コントロール、次に非連結フォーム・コントロールの実装を通して、その違いを見極めます。

図1. 連結フォームと非連結フォームのサンプル・アプリケーション
図1. 連結フォームと非連結フォームのサンプル・アプリケーション

作者リストは、「Authors」ドロップダウン・コンボボックスに表示されます。作者が選択されると、作者の情報コントロール・グループに、選択された作者情報が入ります。そしてメインの「Book」ドロップダウン・コンボボックスには、この作者の著作本のリストが入ります。このコンボボックスから本が選択されると、本の情報コントロール・グループには、選択された本の情報が入ります。

このアプリケーションは、サンプルDB2データベースから2つの表、すなわちBooksとAuthorsをアクセスします。

図2. Authors表とBooks表のスキーマ
図2. Authors表とBooks表のスキーマ

サンプル・シナリオのVisual Basicプロジェクトをアクセスし、2つの表を作成し、アプリケーションの表にデータを取り込む方法の詳細については、付録を参照してください。


ADOプログラミング・モデルの概要

ActiveX Data Objects (ADO) を使用すると、アプリケーションは任意のOLE DBプロバイダーを通して、データ・サーバー中のデータをアクセスしたり操作したりできます。DB2 UDBにはIBMDADB2というネイティブOLE DBプロバイダーが同梱され、DB2のインストール時にシステムにインストールされます。

ADOにより、共通のプログラミング・オブジェクトおよびAPI一式を使用して、データベース・サーバー中のデータをアクセスし、操作するアプリケーションを作成できます。アプリケーション開発者は特定のデータベース・サーバー固有のインターフェースを使用する必要はありません。ADOの主な利点には、使いやすさ、スピード、メモリー・オーバーヘッドが低くディスク・フットプリントが小さいことが挙げられます。ADOはクライアント/サーバー・アプリケーションやWebベース・アプリケーションを作成するための主要機能をサポートします。

図3. ADOオブジェクト・モデル
図3. ADOオブジェクト・モデル

図3に示すように、ADOプログラミング・モデルに見られる主要オブジェクトには、次オブジェクトが含まれます。

Connection

アプリケーションはADO Connectionオブジェクトを通してデータ・ソースをアクセスします。ユーザー・アプリケーションは、通常はビジネス・ロジック層やデータ・アクセス層などの中間層を通して、データ・ソースに対する直接接続 (2層システムともいう) や間接接続 (3層システムともいう) を確立できます。ADO Connectionオブジェクトは、データ・ソースを直接アクセスする場合に必要です。

Command

アプリケーションはADO Commandオブジェクトを使用して、データ・ソースを操作します。典型的なデータ操作には、データ・ソース表または表グループに対する1行以上の追加、削除、更新、検索操作があります。

Parameter

大抵は、ADOコマンドには入力、出力、あるいは入出力変数が必要です。これらの変数は、コマンド実行の前後に変更可能なADO Parameterオブジェクトとして、ADOに関連付けられています。たとえば、同じデータ処理コマンドを発行するにしても、いくつかのユーザー入力値に基づいて、処理する情報の指定を変えることができます。

Recordset

コマンドが、表の行の形式でデータを返す照会である場合、それらの行はADO Recordsetオブジェクトに配置されます。Recordsetを使用すると、同じ表の行を全探索したり、複数の照会結果 (表) を返すコマンドには表を全探索したりできます。

Field

レコードセット内の各行は、データ表の列を表す1つ以上のADO Fieldオブジェクトで構成されます。各フィールドは、名前、データ・タイプ、および値を含む属性を持ちます。値属性は、データ・ソースの実際のデータです。データ・ソース中のデータを変更するには、レコードセット行のフィールド・オブジェクトの値を変更します。


連結データ・フォーム

データ連結フォーム・コントロールとは、単にさまざまなフォーム・コントロールのデータ連結プロパティーを使うことをいいます。これらコントロールは、ADOデータ・コントロールの結果セット列に自動的にリンクされ、コントロール・データと結果セットデータとの間の自動同期化を可能にします。

これは、ADOレコードセット・データ・ソースをレコードセット・フィールド名と共に指定し、そしてフォーム・コントロールをレコードセット・フィールド (複数の場合もあり) にリンクすることによって実現されます。

ADOデータ・コントロール・オブジェクトを用いたデータ連結フォーム

データ・ソースへフォーム・コントロールを連結する方法には、ADOデータ環境 (ConnectionとCommand) オブジェクトを使用する方法やADOデータ・コントロール・オブジェクトを使用する方法を含め、多くの方法があります。

データ・コントロール・オブジェクトを用いたデータ連結フォームを作成するために必要なステップは、次のとおりです。

  1. 必要なActiveXコンポーネントをプロジェクトに追加する
  2. DB2に接続するためのADO Connectionプロパティーを指定する
  3. DB2データを検索するためのADO Commandプロパティーを指定する
  4. フォーム・コントロールをADOデータ・コントロールへ連結する
  5. 4つのADOデータ・コントロールを接続する
  6. 完成したフォームをテストする

ステップ1: 必要なActiveXコンポーネントをプロジェクトに追加する

OLE DBプロバイダーからデータを迅速にアクセスするために、Microsoft ADOデータ・コントロールが使用されます。ADOデータ・コントロールを使用すると、ADO (ActiveX Data Objects) を使用してデータベースへの接続を速やかに作成でき、プロバイダー特有のレコード・ソースのステートメントに基づいてレコードセットを検索できます。

必要なActiveXデータ・コントロール・コンポーネントを使用する前に、まず次のようにしてコンポーネントをサンプル・プロジェクトに追加する必要があります。

  1. メニュー・エントリー「Project」→「Components」をアクセスします。
  2. チェックボックスをクリックして「Microsoft ADO Data Control 6.0」エントリーを選択します。
  3. チェックボックスをクリックして、「Microsoft DataList Controls 6.0」を選択します。
  4. フォームに4つのADOデータ・コントロールを作成し、それぞれadodcAuthors、adodcAuthorData、adodcBooks、adodcBookDataと呼びます。

ステップ2: DB2に接続するためのADO Connectionプロパティーを指定する

データ・コントロールのConnectionプロパティーを、DB2サンプル・データベースを指すように設定する必要があります。これには、前ステップで作成した4つのADOデータ・コントロール・オブジェクトのそれぞれを選択して設定し、次の操作を実施します。

  1. 「Properties」ビューで、Connection Stringプロパティーをダブルクリックします。
  2. 「Use connection string」を選択し、「Build」ボタンをクリックします。
  3. 「Provider」タブで、「IBM OLE DB Provider for DB2 Servers」エントリーを選択します。
  4. 「Connection」タブで、「Data Source」フィールドにsampleを指定します。
  5. 「Use a specific user name and password」ラジオ・ボタンを選択します。
  6. 「Test Connection」をクリックして、その接続ストリングが有効であることを検証します。
  7. 「OK」をクリックして、生成された接続ストリングを受け入れます。

ステップ3: DB2データを検索するためのADO Commandプロパティーを指定する

DB2サンプル・データベースからのデータ検索に求められる適切な照会の実行に必要な、データ・コントロール・プロパティーを設定する必要があります。これには、4つのADOデータ・コントロール・オブジェクトのそれぞれを選択し、次の操作を実施します。

  1. 「Properties」ビューで「Command Type」adCmdTextに変更します。これはコマンドがSQLストリングであることを示します。
  2. 「Properties」ビューで「Cursor Location」adUseClientに変更します。ローカル・カーソル・ライブラリーから供給されたクライアント側のカーソルが使用されることを示します。これは、ローカル・カーソル・エンジンを使うと、ドライバー供給によるカーソルでは不可能な機能の多くが可能になる場合がよくあるためです。
  3. 「Properties」ビューで「Cursor Type」adOpenStaticに変更します。これは他のユーザーによる追加、変更、削除が見えない場合に、結果のレコードセットの静的コピーが使われることを示します。
  4. 「Properties」ビューで「Lock Type」adLockOptimisticに変更します。これはユーザーがコントロールのUpdateメソッドを呼び出すときだけ、プロバイダーがレコードをロックすることを示します。
  5. 「Properties」ビューで、「Record Source」を必要なSQL照会に変更します (表1参照)。
表1. レコード・ソースのSQL照会 コントロール名 レコード・ソースのSQL照会
Control NameRecord Source SQL Query
AdodcAutorsSELECT Name, AuthorID FROM Authors
adodcAuthorDataSELECT Name, Address, City, State, ZipCode, EMailAddress, PhoneNumber FROM Authors WHERE AuthorID = 'xxx'
AdodcBooksSELECT BookID, Title FROM Books WHERE AuthorID = 'xxx'
adodcBookDataSELECT ShortTitle, BookID, ISBNNumber, PubYear, AuthorID, UnitPrice FROM Books WHERE BookID = 'xxx'

ステップ4: フォーム・コントロールをADOデータ・コントロールへ連結する

ここまでに、必要なDB2データを検索するためのデータ・コントロールを設定しました。次は、データ同期化 (表示と更新) を自動化するために、さまざまなフォーム・コントロールをこれらADOデータ・コントロールに連結します。


特殊データ・コントロールを連結する

dcboAuthorsとdcboBooksという、2つの主要な特殊コンボボックス・データ・コントロールがあり、両方ともデータ・コントロールADOレコードセットからの結果が取り込まれる必要があります。

コンボボックス・データ・コントロールは、標準のコンボボックス・コントロールとは異なり、ListField、RowMembe、RowSourceを含む付加的なプロパティーを持っています。これらのプロパティーにより、ADOデータ・コントロールからのレコードセット・データを、コンボボックス項目リストに自動的に取り込むことができます。

このサンプル・フォームでは、RowSourceを使用してコンボボックスにソース・データ・コントロール名を指定し、ListFieldを使用してコンボボックス項目リストのレコードセット列名を指定します (表2参照)。

表2. コンボボックスのソースを指定する
データ・コンボボックスRowSource値ListField値
DcboAuthors adodcAuthorsName
DcboBooks adodcBooks Title
通常のフォーム・コントロールを連結する

2つのデータ・コンボボックスとは別に、フォーム内の残りのコントロールは、「Author Data(作者データ)」と「Book Data(本データ)」の下にグループ化されます。これらのコントロールは標準のフォーム・コントロールで、DataField、DataFormat、DataMember、およびDataSourceプロパティーを使用してデータ・コントロールに連結できます。

サンプル・フォームでは、DataSourceプロパティーを使用してソース・データ・コントロール名を指定し、DataFieldプロパティーを使用して、そのデータ・コントロールのレコードセット列名を指定します。DataFormatプロパティーは、データに対する書式化指定 (オプション) に使用されます。たとえば、浮動小数の列の値2011.23を通貨の値$2,011.23に書式化します。

作者データ・グループ内の各コントロールについては、DataSourceプロパティーはadodcAuthorDataに設定され、DataFieldプロパティーはレコードセットからの適切な列名に設定されます。列の完全なリストについては、表1のadodcAuthorData SQLステートメントを参照してください。

同様に、本データ・グループ内の各コントロールについては、DataSourceプロパティーはadodcBookDataに設定され、DataFieldプロパティーはレコードセットからの適切な列名に設定されます。列の完全なリストについては、表1のadodcBookData SQLステートメントを参照してください。

ステップ5: 4つのADOデータ・コントロールを接続する

サンプルのデザインでは、作者が作者リスト (コンボボックス) から選択されたときに、作者データ・コントロールと本リスト (コンボボックス) の両方とも、新たに選択された作者を反映するよう更新される必要があります。同様に、本が選択されると、本データ・コントロールも新たに選択された本を反映するように更新される必要があります。

作者データを更新する

dcboAuthorsコンボボックスで新しい作者の名前が選択されると、まず選択された作者に対応するAuthorIDを判断し、そのAuthorIDを使用して、adodcBooksおよびadodcAuthorData照会を再実行する必要があります。照会が再実行されると、これら2つのADOデータ・コントロールに連結されたフォーム・コントロールは、再実行された照会の結果セットからの値で自動的に更新されます。

リスト1のVisual Basicコードは、このタスクを実施します。


リスト1. 新たな作者選択を処理するVisual Basicコード
                
		    ' Handle change in author selection
		    Private Sub dcboAuthors_Change()
		    Dim strAuthorName As String
		    Dim strAuthorID As String
		    Dim strSQL As String
		    
		    ' If nothing selected, then do nothing
		    If dcboAuthors.BoundText = "" Then
		    Exit Sub
		    End If
		    
		    ' Lookup selected book name -- fix apostrophe
		    strAuthorName = Replace(dcboAuthors.BoundText, "'", "''")
		    
		    ' Locate the selection in the record set so that we get the AuthorID
		    adodcAuthors.Recordset.Find "Name= '" & strAuthorName & "'", _
		    , adSearchForward, adBookmarkFirst
		    
		    strAuthorID = adodcAuthors.Recordset("AuthorID")
		    
		    ' Change the books list to show only those books for the author selected
		    strSQL = "SELECT BookID, Title FROM Books WHERE AuthorID= '" & strAuthorID & "'"
		    adodcBooks.RecordSource = strSQL
		    adodcBooks.Refresh
		    
		    ' No book is selected by default
		    dcboBooks.Text = ""
		    
		    ' Change the authors data to reflect the author selected
		    strSQL = "SELECT Name, Address,  City, State, ZipCode, EMailAddress, " &_
		    "PhoneNumber from Authors Where AuthorID = '" & strAuthorID & "'"
		    adodcAuthorData.RecordSource = strSQL
		    adodcAuthorData.Refresh
		    
		    End Sub
		  

まずADOデータ・コントロールのレコードセット中で、選択された作者名を持つ行を見付けます。これは、選択された作者名を持つレコードがカレント・レコードの場合に、ADOレコードセットのFindメソッドを使用し、AuthorIDレコードセット列の値を抽出することによって実施されます。adodcBooksとadodcAuthorDataのいずれの照会テキストも、一致するAuthorIDを使用して再生成され、これらADOデータ・コントロール照会は、Refreshメソッドを呼び出すことにより、再実行されます。


本のデータを更新する

新しい本のタイトルがdcdoBooksコンボボックスで選択されると、まず選択された本に対応するBookIDを判断し、選択されたBookIDを使用してadodcBookData照会を再実行する必要があります。照会が再実行されると、このADOデータ・コントロールに連結されたフォーム・コントロールは、再実行された照会の結果セットからの値で自動的に更新されます。

リスト2のVisual Basicコードは、このタスクを実施します。


リスト2. 本のデータを更新する
                
		    ' Handle change in book selection
		    Private Sub dcboBooks_Change()
		    Dim strBookName As String
		    Dim strBookID As String
		    Dim strSQL As String
		    
		    ' If nothing is selected, then do nothing
		    If dcboBooks.BoundText = "" Then
		    Exit Sub
		    End If
		    
		    ' Lookup selected book name -- fix apostrophe
		    strBookName = Replace(dcboBooks.BoundText, "'", "''")
		    
		    ' Find the book id for the title selected
		    adodcBooks.Recordset.Find "Title= '" & strBookName & "'", _
		    , adSearchForward, adBookmarkFirst
		    
		    strBookID = adodcBooks.Recordset("BookID")
		    
		    ' Change the book data to reflect the book selected
		    strSQL = "SELECT ShortTitle, BookID, ISBNNumber, PubYear, AuthorID, " & _
		    "UnitPrice from Books Where BookID = '" _
		    & strBookID & "'"
		    adodcBookData.RecordSource = strSQL
		    adodcBookData.Refresh
		    
		    End Sub
		  

ここでも同様に、まず最初に、ADOデータ・コントロール・レコードセット中で、選択された本のタイトルの入った行を見付けます。これは、選択された本のタイトルを持つレコードがカレント・レコードの場合に、ADOレコードセットのFindメソッドを使用し、次にBookIDレコードセット列の値を抽出することによって実施されます。adodcBookDataの照会テキストは、一致するBookIDを使用して再生成され、コントロールのRefreshメソッドを呼び出すことで、このADOデータ・コントロール照会が再実行されます。

ステップ6: 完成したフォームをテストする

以上に示した、限られたコーディング量で、サンプルのアプリケーション・データをアプリケーション・フォーム・コントロールへ結合しました。このアプリケーションをテストするには、単に実行し、「bound form」ボタンをクリックし、作者を選択して、データ結合フォームからその作者のを選択します。フォーム・データは、これら選択を行うとすぐに更新されなければなりません。


非結合データ・フォーム

最初に概説したとおり、非結合データ・フォームとは、ADOプログラミングAPIを使用して手作業でさまざまなフォーム・コントロールをADOレコードセットへ「フックアップ」することをいいます。このタスクの遂行に要する作業は多くなりますが、時にはデータ結合プログラミングよりも効率的で柔軟です。さらに、複数層アプリケーションの中間層コンポーネントを開発する場合には、非結合データ・フォームは唯一の有効なアプローチです。中間層コードでは、結合対象となるビジュアル・コントロールはなく、結果セット・データは、1つの層、通常はデータ・アクセス層から検索され、プレゼンテーション層などの別の層へ渡されます。

ADOプログラミング・モデルを使用した非結合データ・フォーム

ADOプログラミングAPIを使用した非結合データ・フォームの作成に必要なステップは、次のとおりです。

  1. ADO Connectionオブジェクトをコーディングする
  2. ADO CommandおよびParameterオブジェクトをコーディングする
  3. コンボボックスに結果セット値を取り込む
  4. フォーム・コントロールを結果セット値で更新する
  5. 自動更新用にフォーム・コントロールを接続する
  6. 完成したフォームをテストする

ステップ1: ADO Connectionオブジェクトをコーディングする

サンプルのアプリケーションには、DB2からデータを検索するためにサンプルのすべてのADOコマンドで使用できるADO Connectionオブジェクトが1つだけ必要です。このADO Connectionオブジェクトは、ConnectionStringプロパティーと、CursorLocationプロパティーを含む他の接続のプロパティーを使用して、OLE DBプロバイダーとデータ・ソース名を指定するために使用されます。リスト3の部分コードは、acnBooksConnectionオブジェクトの作成および設定方法を示しています。


リスト3. Connectionオブジェクトの作成と設定
                
		    ' Create connection object and connect to database
		    Set acnBooks = New ADODB.Connection
		    
		    With acnBooks
		    .ConnectionString = "Provider=IBMDADB2.1;Data Source=SAMPLE"
		    .CursorLocation = adUseClient
		    .Open
		    End With
		  

結合の例と同様に、ローカル・カーソル・ライブラリーによって供給されるクライアント側のカーソルが使用されることを示す、adUseClientという値を使用しました。これは、ローカル・カーソル・エンジンを使うと、ドライバー供給によるカーソルでは不可能な機能の多くが可能になるためです。

これで、接続が確立されるときをADOオブジェクトのOpenメソッドを使い、解放されるときを同Closeメソッドを使って、完全に制御できるようになりました。 ステップ2: ADO CommandおよびParameterオブジェクトをコーディングする サンプルのアプリケーションには、さまざまなデータ結果セットを検索するために、4つのADOコマンドが必要です。

ステップ2: ADO CommandおよびParameterオブジェクトをコーディングする

サンプルのアプリケーションには、さまざまなデータ結果セットを検索するために、4つのADOコマンドが必要です。

  1. acmAuthorsコマンド。作者リストを検索するため (リスト4参照)
  2. acmBooksコマンド。特定の作者の著作本リストを検索するため
  3. acmAuthorInfoコマンド。特定の作者の情報を検索するため
  4. acmBookInfoコマンド。特定の本の情報を検索するため

リスト4. 作者リストを検索するコマンド
                
                ' Set up the authors command
		    Set acmAuthors = New ADODB.Command
		    With acmAuthors
		    .ActiveConnection = acnBooks
		    .CommandType = adCmdText
		    .CommandText = "SELECT AuthorID, Name from Authors"
		    End With
		  

acmAuthorsコマンドには入力パラメーターは必要ありませんが、acmBooksコマンドとacmAuthorInfoにはAuthorIDという入力パラメーター、acmBookInfoコマンドにはBookID入力パラメーターが必要です。これらのコマンド用に、CreateParameterメソッドを使ってADO Prameterオブジェクトを作成し、Appendメソッドを使ってコマンドに追加する必要があります (リスト5参照)。


リスト5. Parameterオブジェクトを作成してコマンドに追加する
                
                ' Set up the books command
		    Set acmBooks = New ADODB.Command
		    With acmBooks
		    .ActiveConnection = acnBooks
		    .CommandType = adCmdText
		    .CommandText = "SELECT BookID, Title FROM Books WHERE AuthorID= ?"
		    Set adoParm = .CreateParameter("AuthorID", adChar, adParamInput, 1, "x")
		    .Parameters.Append adoParm
		    End With
		  

残りの2つのコマンド (acmAuthorInfoとacmBookInfo) も同様にして実装できますが、パラメーターが異なり、それぞれAuthorIDとBookIDです。表2に、これらADOコマンドに必要なCommandTextを示しています。

表2. acmAuthorInfoとacmBookInfoに必要なSQL照会
コマンド名コマンド・テキスト (SQL照会)
AcmAutorInfo SELECT Name, Address, City, State, ZipCode, EMailAddress, honeNumber FROM Authors WHERE AuthorID = ?
AcmBookInfo SELECT ShortTitle, BookID, ISBNNumber, PubYear, AuthorID, UnitPrice FROM Books WHERE BookID = ?

ステップ3: コンボボックスに結果セット値を取り込む

データ結合コンボボックス・コントロールとは異なり、非結合コントロールはプログラム的にリスト・データで埋められる必要があります。これは、最初に必要な結果セットを取得し、次に適切な結果セット列をコンボボックス項目リストへ1行ずつ追加することによって実施されます。

ADO照会を実行する

最初に、ADO照会を実行します。

  1. 実行するADOコマンドの結果を保持するADO Recordsetオブジェクトを作成します。
  2. 適切なADOコマンドを渡すADO RecordsetのOpenメソッドを使用して、コマンドを実行します。
    • パラメーターCursor TypeをadOpenStaticに設定します。これは他のユーザーによる追加、変更、削除が見えない場合に、結果のレコードセットの静的コピーが使用されることを示します。
    • パラメーターLock TypeをadLockOptimisticに設定します。これは、コントロールのUpdateメソッドを呼び出したときだけ、プロバイダーがレコードをロックすることを示します。

リスト6の部分コードは、acmAuthors ADOコマンドの実行方法を示しています。


リスト6. acmAuthors ADOコマンドを実行する
                
                ' Execute query
		    Set arsAuthors = New ADODB.Recordset
		    arsAuthors.Open acmAuthors, , adOpenStatic, adLockOptimistic
		  

コンボボックスに値を入れる

次に、照会実行の結果からの必要なデータをコンボボックスに取り込みます。

  1. 以前のコンボボックス・リストの項目が (もしあれば) 消去します。
  2. 結果セットの各行につき、必要な列をコンボボックス・リスト項目に追加します。

リスト7は、acmAuthors ADOコマンドの実行結果からのデータ (arsAuthors) でcboAuthors標準コンボボックスを埋める方法を示しています。


リスト7. 照会の結果をコンボボックスに取り込む
                
                ' Populate combo-box with query results
		    cboAuthors.Clear
		    While Not arsAuthors.EOF
		    cboAuthors.AddItem arsAuthors!Name
		    arsAuthors.MoveNext
		    Wend
		  

結果セット列データをアクセスするには、いくつか方法があります。サンプルでは、Recordset!ColumnName-暗黙構文を使用しました。他には、Recordset.Fileds.Item("ColumnName")-明示構文を使う方法もあります。

ステップ4: フォーム・コントロールを結果セット値で更新する

データ結合フォーム・コントロールとは異なり、非結合フォーム・コントロールは、プログラム的に結果セット・データと同期化される必要があります。これは、まず必要な結果セットを取得し、その結果セットからのデータでフォーム・コントロール値を更新することによって、実施されます。以上が、読み取り専用フォームに必要なすべてです。

リスト8の部分コードは、acmAuthorInfo ADOコマンドの実行結果のデータで、作者情報を更新する方法を示しています。


リスト8. 作者情報コントロールを更新する
                
                ' Execute the result set
		    Dim arsAuthorInfo As ADODB.Recordset
		    Set arsAuthorInfo = New ADODB.Recordset
		    arsAuthorInfo.Open acmAuthorInfo, , adOpenStatic, adLockOptimistic
		    
		    ' Update the form controls
		    txtName = arsAuthorInfo!Name & ""
		    txtAddress = arsAuthorInfo!Address & ""
		    txtCity = arsAuthorInfo!City & ""
		    txtState = arsAuthorInfo!State & ""
		    txtZipCode = arsAuthorInfo!ZipCode & ""
		    txtEmail = arsAuthorInfo!EMailAddress & ""
		    txtPhone = Format(arsAuthorInfo!PhoneNumber & "", "(000) 000-0000")
		    
		    ' Release the result set object
		    arsAuthorInfo.Close
		    Set arsAuthorInfo = Nothing
		  

ヌル値を許容されるフィールドについて、VB構文Recordset!ColumnName & ""を用いてフィールド値に空ストリングを追加する一般的なトリックを使い、ヌル値割り当てのランタイム・エラーを回避しています。また、フォーム・フィールドへの取り込みが終わるとすぐに結果セット・オブジェクトを解放するので、読み取り専用アクセス・モード用にコードを最適化することにも注意してください。

ステップ5: 自動更新用にフォーム・コントロールを接続する

前述の結合フォームの説明と同様、サンプルのデザインでは、作者リストから作者が選択されると、作者データ・コントロールと作者の本のリストの両方とも、新たに選択された作者を反映するように更新される必要があります。同様に、本が選択されると、本データ・コントロールも新たに選択された本を反映するように更新される必要があります。

この実施に必要なコードは、結合フォーム・コードと非常によく似ています。ただし、すでに概説したとおり、プログラム的に照会を再実行して、フォーム・コントロールを更新することを除きます。

ステップ6: 完成したフォームをテストする

アプリケーション・データをアプリケーション・フォーム・コントロールにプログラム的に結合するために必要なコードのすべてが完成した後は、アプリケーションをテストできます。このアプリケーションをテストするには、単に実行し、「unbound form」ボタンをクリックし、作者その著作本を非結合データ・フォームから選択します。フォーム・データは、これらの選択をするとすぐに更新される必要があります。


結合データ・フォームと非結合データ・フォーム

これまでに示したとおり、Visual Basicでは、結合または非結合のフォーム・コントロールを使用して、ユーザーはDB2 GUIアプリケーションをコーディングできます。結合か非結合かの選択に先立ち、アプリケーション要件を見直します。表3は、これら2つの方式の主な長所と短所 (違い) のいくつかを示しています。

表3. 結合データ・フォームと非結合データ・フォームを比較する
基準結合フォーム・コントロール非結合フォーム・コントロール
接続 接続は自動的にオープン/クローズされます。使用されるデータ・ソース・コントロールの数と種類によって、このような接続が複数使用されます。接続の数と、それら接続がいつオープン/クローズされるかを制御します。
トランザクション トランザクションの制御はもっと困難です。ConnectionオブジェクトのBegin Transaction、Commit、Rollbackメソッドを使用して、トランザクションと作業単位を明示的に制御します。
データ書式化 フォーム・コントロールは、双方向 (表示<->保管) の自動書式化を実施でき、各コントロールを1つのレコードセット・フィールドにマッピングします。複数のレコードセット・フィールドは、1つのフォーム・コントロールにマップされます。したがって、「姓、名」をフォーム・コントロールにマップするカスタム・マッピングも作成できます。

結論

データ結合コントロールを使用すると、限られたコーディング量で迅速なアプリケーション開発ができます。これは、グラフィカル・ユーザー・インターフェースを構築する際に特に便利です。ただし、データベース接続やトランザクションを明示的に管理し、フィールド・マッピングを制御する必要もあり、非結合フォーム・コントロールは有効な代替手段になります。

この記事では、IBM DB2ユニバーサル・データベース・サーバーが、DB2データベース用のIBM OLE DBネイティブ・プロバイダーを使用して、結合および非結合のデータ・コントロールのいずれとも円滑に動作できることを示しています。

IBM DB2データベースの詳細は、http://www.ibm.com/jp/software/data/db2/udbを参照してください。

ADOプログラミング・モデルの詳細は、http://www.microsoft.com/data/adoを参照してください。


付録:サンプルのダウンロード

この記事に含まれるDB2Bound.zipには、完全なDB2Bound Visual Basicプロジェクト・ソース・コードと、2つのアプリケーション表の作成と取り込みに必要なDB2スクリプトおよびデータ・ファイルも含まれます。

DB2Bound.zipファイルの一部として次のファイルが含まれます。

  • ADODisplay.vbp - Visual Basic 6.0プロジェクト・ファイル
  • ADODisplay.exe - ADODisplayプロジェクトをコンパイルした結果の実行形式プログラム
  • CreateTables.db2 - 必要なDB2表を作成するスクリプト
  • CreateTables.bat - DB2スクリプト・ファイルのCreateTables.db2の実行に使用されるコマンド・ファイル。DB2コマンド・ウィンドウからこのコマンドを起動します
  • LoadTables.bat - authors.txtおよびbooks.txtファイルからのデータでアプリケーション表をロードするために、DB2 ロード機能の実行に使用されるコマンド・ファイル
  • authors.txt - Authors表のサンプル・データを含む、区切り文字付きテキスト・ファイル
  • books.txt - Books表のサンプル・データを含む、区切り文字付きテキスト・ファイル
  • DropTables.bat - 作成されたアプリケーション表の削除に使われるコマンド。このコマンドはDB2コマンド・ウィンドウから起動します

これらのファイルは、保証なしで提供されており、明示的あるいは暗黙的な保証やサポートが一切提供されないことを理解したうえで、必要に応じて自由に使用、変更、あるいは再配布したりできます。

アプリケーションのセットアップとデータのローディング

アプリケーションをセットアップするには、DB2コマンド・ウィンドウを開いて、CreateTables.batとLoadTables.batという、2つのバッチ・ファイルを実行するだけです。これらのファイルは、アプリケーション表をサンプルDB2データベースへ作成してロードします。

表がロードされた後は、ADODisplay.exeを実行することで、アプリケーションを直接実行するか、あるいはADODisplay.vbpを使用してプロジェクトをVisual Basicへロードし、Visual Basicの内部から実行することもできます。

アプリケーションをクリーニングする

アプリケーションに関連付けられたリソースをクリーンアップ (ドロップ) するには、DB2コマンド・ウィンドウを開いて、DropTables.batバッチ・ファイルを実行するだけです。このコマンドは、CreateTables.batで作成された2つのアプリケーション表を、削除してドロップします。



ダウンロード

ファイル名サイズダウンロード形式
DB2Bound.zip25 KBFTP|HTTP

ダウンロード形式について


参考文献

著者について

Essma Hasinは、Visual BasicおよびC言語の認定プログラマーで、Neneva Technologies社の品質保証エンジニアです。Neneva Technologies社は、IBM DB2 UDBとMicrosoft .NETフレームワークを利用した中小規模の企業向けにカスタム・ソリューションを専門とするコンサルティング会社です。 メール・アドレス:essma@neneva.com

不正使用の報告のヘルプ

不正使用の報告

ありがとうございます。 このエントリーは、モデレーターの注目フラグが設定されました。


不正使用の報告のヘルプ

不正使用の報告

不正使用の報告の送信に失敗しました。


developerWorks: サイン・イン


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。 プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。 お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

表示名をお選びください

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

(半角英数字で3文字以上31文字以下にする必要があります)


「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


この記事を評価する

コメント

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Information Management
ArticleID=322979
ArticleTitle=DB2 7.2とVisual Basic 6.0 - ADOの連結および非連結フォーム
publish-date=12152004
author1-email=mailto:essma@neneva.com
author1-email-cc=

タグ

Help
このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。

スライダーバーを使用することで、より多く(少なく)タグを表示します。

人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。

マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。

このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。