|
Dynamic Link Libraries |
Top Previous Next |
|
データベースにアクセスするダイナミックリンクライブラリを作成する時、4つの違った状況を区別できます: DLL-only database access この場合、ホストプログラムは一切のデータベースアクセスをしません。だからDLLはログオン・ログオフのセッションと制御を所有します。このようなDLLと通常のDOAアプリケーションに違いはありません。 DOA DLL sharing a session with a DOA host program ホストプログラムはTOracleSession を所有し、DLLの外部初期化プロシージャーを通じてDLLにそれを渡すことが出来ます。このDLL初期化プロシージャーはShare プロシージャーを呼び、物理的データベースセッションをホストセッションとローカルデータモジュール内のセッションの間で共有することが出来ます。例えば: procedure InitSession(HostSession: TOracleSession); begin DLLDataModule := TDLLDataModule.Create(nil); HostSession.Share(DLLDataModule.Session); end;
ホストプログラムとDLLにログオン・ログオフするための厳密な順序があります: 1. ホストプログラムのログオン 2. DLLとセッションを共有 3. (アプリケーション処理) 4. ログオフかDLL内のセッション解放 5. ホストプログラムのログオフ DOA DLL sharing a session with a non-DOA host program もし非DOAホストプログラム(例えばPro*Cで書かれたような)とセッションを共有しなければならないDLLを書いている場合、ホストプログラムに存在しないのでTOracleSession を渡すことは出来ません。セッションを共有するためにDLL内のTOracleSession にLDA (SQL*Net: Logon Data Area)かSVC (Net8: Service Context)へのポインターを渡すことが出来ます。このポインターをTOracleSession.ExternalLDAかTOracleSession.ExternalSVCプロパティへ割り当てる時、セッションは事実上ログオンされています。このセッションへリンクされている全てのコンポーネントはこのLDAかSVCと連動します。 nilポインターをExternalLDAかExternalSVCに割り当てる時、セッションはログオフされたみなされます。 ホストプログラムとDLLにログオン・ログオフするための厳密な順序があります: 1. ホストプログラム ログオン 2. ExternalLDAかExternalSVCに値を割り当てる 3. (アプリケーション処理) 4. ExternalLDAかExternalSVCにnilを割り当てる 5. ホストプログラム ログオフ もしExternalLDAかExternalSVCにnilを割り当てる前にホストプログラム内でログオフすると、DLL内のコンポーネントは解放されたときに"not logged on"エラーを起こします。 なぜならTOracleSession.Connected プロパティは実際の状況を反映しないからです。 Non-DOA DLL sharing a session with a DOA host program 非DOA-DLL(例えばPro*C で書かれたような)とセッションを共有する必要があるアプリケーションを書いている場合、ExternalLDA or ExternalSVCプロパティを通じてTOracleSession のLDA (Logon Data Area)かSVC (Service Context)へのポインターを取得することが出来ます。DLLはLDAかSVCを所得するためのプロシージャーを提供する必要があります。 |