グラフィック・ユーザー・インターフェース (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. 連結フォームと非連結フォームのサンプル・アプリケーション
作者リストは、「Authors」ドロップダウン・コンボボックスに表示されます。作者が選択されると、作者の情報コントロール・グループに、選択された作者情報が入ります。そしてメインの「Book」ドロップダウン・コンボボックスには、この作者の著作本のリストが入ります。このコンボボックスから本が選択されると、本の情報コントロール・グループには、選択された本の情報が入ります。
このアプリケーションは、サンプルDB2データベースから2つの表、すなわちBooksとAuthorsをアクセスします。
図2. Authors表とBooks表のスキーマ
サンプル・シナリオのVisual Basicプロジェクトをアクセスし、2つの表を作成し、アプリケーションの表にデータを取り込む方法の詳細については、付録を参照してください。
ActiveX Data Objects (ADO) を使用すると、アプリケーションは任意のOLE DBプロバイダーを通して、データ・サーバー中のデータをアクセスしたり操作したりできます。DB2 UDBにはIBMDADB2というネイティブOLE DBプロバイダーが同梱され、DB2のインストール時にシステムにインストールされます。
ADOにより、共通のプログラミング・オブジェクトおよびAPI一式を使用して、データベース・サーバー中のデータをアクセスし、操作するアプリケーションを作成できます。アプリケーション開発者は特定のデータベース・サーバー固有のインターフェースを使用する必要はありません。ADOの主な利点には、使いやすさ、スピード、メモリー・オーバーヘッドが低くディスク・フットプリントが小さいことが挙げられます。ADOはクライアント/サーバー・アプリケーションやWebベース・アプリケーションを作成するための主要機能をサポートします。
図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データ・コントロール・オブジェクトを使用する方法を含め、多くの方法があります。
データ・コントロール・オブジェクトを用いたデータ連結フォームを作成するために必要なステップは、次のとおりです。
- 必要なActiveXコンポーネントをプロジェクトに追加する
- DB2に接続するためのADO Connectionプロパティーを指定する
- DB2データを検索するためのADO Commandプロパティーを指定する
- フォーム・コントロールをADOデータ・コントロールへ連結する
- 4つのADOデータ・コントロールを接続する
- 完成したフォームをテストする
ステップ1: 必要なActiveXコンポーネントをプロジェクトに追加する
OLE DBプロバイダーからデータを迅速にアクセスするために、Microsoft ADOデータ・コントロールが使用されます。ADOデータ・コントロールを使用すると、ADO (ActiveX Data Objects) を使用してデータベースへの接続を速やかに作成でき、プロバイダー特有のレコード・ソースのステートメントに基づいてレコードセットを検索できます。
必要なActiveXデータ・コントロール・コンポーネントを使用する前に、まず次のようにしてコンポーネントをサンプル・プロジェクトに追加する必要があります。
- メニュー・エントリー「Project」→「Components」をアクセスします。
- チェックボックスをクリックして「Microsoft ADO Data Control 6.0」エントリーを選択します。
- チェックボックスをクリックして、「Microsoft DataList Controls 6.0」を選択します。
- フォームに4つのADOデータ・コントロールを作成し、それぞれadodcAuthors、adodcAuthorData、adodcBooks、adodcBookDataと呼びます。
ステップ2: DB2に接続するためのADO Connectionプロパティーを指定する
データ・コントロールのConnectionプロパティーを、DB2サンプル・データベースを指すように設定する必要があります。これには、前ステップで作成した4つのADOデータ・コントロール・オブジェクトのそれぞれを選択して設定し、次の操作を実施します。
- 「Properties」ビューで、Connection Stringプロパティーをダブルクリックします。
- 「Use connection string」を選択し、「Build」ボタンをクリックします。
- 「Provider」タブで、「IBM OLE DB Provider for DB2 Servers」エントリーを選択します。
- 「Connection」タブで、「Data Source」フィールドにsampleを指定します。
- 「Use a specific user name and password」ラジオ・ボタンを選択します。
- 「Test Connection」をクリックして、その接続ストリングが有効であることを検証します。
- 「OK」をクリックして、生成された接続ストリングを受け入れます。
ステップ3: DB2データを検索するためのADO Commandプロパティーを指定する
DB2サンプル・データベースからのデータ検索に求められる適切な照会の実行に必要な、データ・コントロール・プロパティーを設定する必要があります。これには、4つのADOデータ・コントロール・オブジェクトのそれぞれを選択し、次の操作を実施します。
- 「Properties」ビューで「Command Type」をadCmdTextに変更します。これはコマンドがSQLストリングであることを示します。
- 「Properties」ビューで「Cursor Location」をadUseClientに変更します。ローカル・カーソル・ライブラリーから供給されたクライアント側のカーソルが使用されることを示します。これは、ローカル・カーソル・エンジンを使うと、ドライバー供給によるカーソルでは不可能な機能の多くが可能になる場合がよくあるためです。
- 「Properties」ビューで「Cursor Type」をadOpenStaticに変更します。これは他のユーザーによる追加、変更、削除が見えない場合に、結果のレコードセットの静的コピーが使われることを示します。
- 「Properties」ビューで「Lock Type」をadLockOptimisticに変更します。これはユーザーがコントロールのUpdateメソッドを呼び出すときだけ、プロバイダーがレコードをロックすることを示します。
- 「Properties」ビューで、「Record Source」を必要なSQL照会に変更します (表1参照)。
| Control Name | Record Source SQL Query |
|---|---|
| AdodcAutors | SELECT Name, AuthorID FROM Authors |
| adodcAuthorData | SELECT Name, Address, City, State, ZipCode, EMailAddress, PhoneNumber FROM Authors WHERE AuthorID = 'xxx' |
| AdodcBooks | SELECT BookID, Title FROM Books WHERE AuthorID = 'xxx' |
| adodcBookData | SELECT 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 | adodcAuthors | Name |
| 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ステートメントを参照してください。
サンプルのデザインでは、作者が作者リスト (コンボボックス) から選択されたときに、作者データ・コントロールと本リスト (コンボボックス) の両方とも、新たに選択された作者を反映するよう更新される必要があります。同様に、本が選択されると、本データ・コントロールも新たに選択された本を反映するように更新される必要があります。
作者データを更新する
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データ・コントロール照会が再実行されます。
以上に示した、限られたコーディング量で、サンプルのアプリケーション・データをアプリケーション・フォーム・コントロールへ結合しました。このアプリケーションをテストするには、単に実行し、「bound form」ボタンをクリックし、作者を選択して、データ結合フォームからその作者の本を選択します。フォーム・データは、これら選択を行うとすぐに更新されなければなりません。
最初に概説したとおり、非結合データ・フォームとは、ADOプログラミングAPIを使用して手作業でさまざまなフォーム・コントロールをADOレコードセットへ「フックアップ」することをいいます。このタスクの遂行に要する作業は多くなりますが、時にはデータ結合プログラミングよりも効率的で柔軟です。さらに、複数層アプリケーションの中間層コンポーネントを開発する場合には、非結合データ・フォームは唯一の有効なアプローチです。中間層コードでは、結合対象となるビジュアル・コントロールはなく、結果セット・データは、1つの層、通常はデータ・アクセス層から検索され、プレゼンテーション層などの別の層へ渡されます。
ADOプログラミング・モデルを使用した非結合データ・フォームADOプログラミングAPIを使用した非結合データ・フォームの作成に必要なステップは、次のとおりです。
- ADO Connectionオブジェクトをコーディングする
- ADO CommandおよびParameterオブジェクトをコーディングする
- コンボボックスに結果セット値を取り込む
- フォーム・コントロールを結果セット値で更新する
- 自動更新用にフォーム・コントロールを接続する
- 完成したフォームをテストする
ステップ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コマンドが必要です。
- acmAuthorsコマンド。作者リストを検索するため (リスト4参照)
- acmBooksコマンド。特定の作者の著作本リストを検索するため
- acmAuthorInfoコマンド。特定の作者の情報を検索するため
- 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 = ? |
データ結合コンボボックス・コントロールとは異なり、非結合コントロールはプログラム的にリスト・データで埋められる必要があります。これは、最初に必要な結果セットを取得し、次に適切な結果セット列をコンボボックス項目リストへ1行ずつ追加することによって実施されます。
ADO照会を実行する最初に、ADO照会を実行します。
- 実行するADOコマンドの結果を保持するADO Recordsetオブジェクトを作成します。
- 適切な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
|
コンボボックスに値を入れる
次に、照会実行の結果からの必要なデータをコンボボックスに取り込みます。
- 以前のコンボボックス・リストの項目が (もしあれば) 消去します。
- 結果セットの各行につき、必要な列をコンボボックス・リスト項目に追加します。
リスト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 & ""を用いてフィールド値に空ストリングを追加する一般的なトリックを使い、ヌル値割り当てのランタイム・エラーを回避しています。また、フォーム・フィールドへの取り込みが終わるとすぐに結果セット・オブジェクトを解放するので、読み取り専用アクセス・モード用にコードを最適化することにも注意してください。
前述の結合フォームの説明と同様、サンプルのデザインでは、作者リストから作者が選択されると、作者データ・コントロールと作者の本のリストの両方とも、新たに選択された作者を反映するように更新される必要があります。同様に、本が選択されると、本データ・コントロールも新たに選択された本を反映するように更新される必要があります。
この実施に必要なコードは、結合フォーム・コードと非常によく似ています。ただし、すでに概説したとおり、プログラム的に照会を再実行して、フォーム・コントロールを更新することを除きます。
アプリケーション・データをアプリケーション・フォーム・コントロールにプログラム的に結合するために必要なコードのすべてが完成した後は、アプリケーションをテストできます。このアプリケーションをテストするには、単に実行し、「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.zip | 25 KB | FTP |
-
developerWorks Japan: Information Management : Information Managementの日本語技術情報サイトです
-
developerWorks: Information Management(US) : Information Managementの英語の技術情報サイトです
Essma Hasinは、Visual BasicおよびC言語の認定プログラマーで、Neneva Technologies社の品質保証エンジニアです。Neneva Technologies社は、IBM DB2 UDBとMicrosoft .NETフレームワークを利用した中小規模の企業向けにカスタム・ソリューションを専門とするコンサルティング会社です。 メール・アドレス:essma@neneva.com