13.2.1 データベース接続
DEFINE_DB_SERVER
は、他のBIFとは別に単独で使用して接続パラメータおよびデータベース・タイプのオーバーライドだけを行うか、以下のすべての関連BIFと共に、この順
序で使用することができます。
DEFINE_DB_SERVER、CONNECT_SERVER、CONNECT_FILE
このBIFのフル・セットは、データベース内にある外部ファイルが、ロードされたものと異なるDSNを持つ場合にのみ必要になります。
起動時に、すべてのデフォルト・データベース、すなわちOAMに定義されているすべてのデータベースに接続するには、各OAMにあるDSNを使用して、 (データベース・タイプを指定して)DEFINE_DB_SERVERおよびCONNECT_SERVERを実行する必要があります。DSNがOAMにあ るときと同じ場合は、CONNECT_FILEを実行する必要はありません。つまり、外部ファイルは、ロードされたデータベースに暗黙的に接続されるとい うことです。
ユーザー環境に、開発、テスト、および生産というバージョン別の戦略がある場合、アプリケーションがこのさまざまな段階を進むにつれ、外部ファイルの配置 場所の差別化を管理するための最も簡単な方法は、使用するODBC DSNを同一にして、なおかつ異なる物理データベースをポイントするように定義を変更することになります。このように定義することで、OAMに埋め込まれ る省略時のデータベースは、複数の物理データベースにアクセスするようになります。
データベースを自由に切り替えることは単純な操作のように思えますが、共有されているOAMがある場合、すなわち同じファイルを複数のデータベースで使用 している場合は、容易ではありません。共有されているOAMがある状況でデータベースを切り替えるには、コード/ファイル検索、トリガーなどを含む、使用 していたすべてのファイルを閉じる必要があり、ファイルを見落としがちです。これを行わないと、元のデータベースに対してアクセスが行われます。これは、 ファイルを開くときにデータベースが設定されるためです。それ以降、すべてのIOは、元のデータベースに対して行われます。1つのフォームを使用している ときは、CLOSEを実行すれば、使用していたすべてのファイルを閉じることができます。複数のオブジェクトを使用していた場合は、これよりはるかに複雑 になります。戻る前にすべてのHEAVYUSAGEオブジェクトから確実にCLOSEを呼び出し、すべてのコンポーネントとファンクションを終了して最初 のコンポーネント/ファンクションに戻ることが不可欠です。実際、LIGHTUSAGEファンクションおよび動的コンポーネントをいたるところで使用する ことが最善策である場合もあります。以下は、最初のコンポーネントが何らかのファイルにアクセスする場合に、そのコンポーネント内で実行する必要のある コードの例です。
Subroutine Name(SwitchSRV) Parms(#SwitchSRV)
Define Field(#LastSRV) Reffld(#SERVER1)
クローズ
If ('#Switchsrv *NE #Lastsrv')
If ('#LastSRV *NE *BLANK')
Use Builtin(Disconnect_file) With_Args(* #LastSRV)
Endif
Use Builtin(connect_file) With_Args(* #SwitchSRV)
Endif
#LastSRV := #SwitchSRV
Endroutine
コミット制御下でファイルに接続しているデータベースが複数ある場合、COMMITまたはROLLBACKを実行すると、すべてのデータベースですべての トランザクションがコミットまたはロールバックされます。