TOracleLogonによる、ログイン方法を説明します。

接続の方法2 – TOracleLogon

アプリケーションが使用するオラクルインスタンスやユーザが固定でない場合、ユーザの入力を受け付けるためのログオン画面が必要です。この方法については先程のセクションで説明しましたが、手っ取り早くログオン画面をアプリケーションに追加するために使えるのがTOracleLogon
コンポーネント
です。

Net*8を使う場合、期限切れパスワードの更新を求めるなどの機能も持っており、便利です。

  • TOracleLogonは、TOpenDialogのようなダイアログ表示コンポーネントです。
    • property
      Session :
      接続するTOracleSessionを与えます。このSessionから、ユーザ名、パスワード、データベースをデフォルト値として引継ぎます
    • function
      Execute : Boolean;
      ログオン画面を表示し、データベースにログオンします。ユーザがキャンセルボタンを押した場合は、戻り値Falseを返します。
      通常の使用では、TOracleSessionと同じデータモジュール(またはフォーム)上にTOracleLogonを置き、SessionプロパティがTOracleSessionを指すようにして、単にExecuteメソッドを呼び出します。
  procedure TForm1.Button1Click(Sender: TObject);
  begin
    if not OracleLogon.Execute then begin
      showmessage('接続を中止しました');
    end;
  end; //注意:このコードは後述の理由により不完全です

接続失敗時の処理

TOracleLogonを使う上で注意が必要なのが、ログオン時の例外処理です。TOracleLogonは、ログオンの際に発生する可能性のある主要なOracleのエラーについて、すでにエラーハンドリングのロジックを持っています。すなわち、TOracleLogon.Executeの内部で例外が処理されてしまいますので、Executeを
try … except
ブロックで囲んでも例外を検出することはできません。TOracleLogonに組み込みのエラー処理を活用する方向で考えてください。

TOracleLogonのメッセージは英語なので、納品用の場合は自前のログオンダイアログを作成するか、DOAのソースコードを購入して、TOracleLogonのダイアログのフォントを日本語フォントに変えて使用するのがよいでしょう。

  • TOracleLogon
    • property
      Retries : word;
      ログオンに失敗しても、指定した回数繰り返します。デフォルトは2ですので、2回まではパスワード入力を間違えても大丈夫ですが、3回目で失敗すると、ログインを諦めます。
    • property
      Optios : 以下のオプションを設定します

      • ldAuto (UserName, Password
        両方が与えられた場合、自動でログインします(デフォルトTrue)
      • ldDatabase : データベース名のユーザ入力を可能にします(デフォルトTrue)
      • ldDatabaseList :
        Net8の設定(tnsnames.oraファイル)に従ってデータベース名をドロップダウンリストに表示します。
      • ldLogonHistory :
        過去のログオンに用いたユーザID,パスワード,データベースなどの情報を、INIファイルかレジストりに保存し、簡単に選択できるようにします。この機能に関連したプロパティとしてHistoryRegSection,
        HistorySize, HistoryWithPassword
        などのプロパティもありますので参考にしてください。(デフォルトFalse)
      • ldConnectAs : SYSDBA, SYSOPERとしての接続を選択できるようにします(デフォルトFalse)
        以下に、一般的なTOracleLogonの使用例を示します
  procedure TForm1.ConnectButtonClick(Sender: TObject);
  begin
    if not OracleLogon.Execute then
      showmessage('接続をキャンセルしました') //ユーザがキャンセルボタンを押した場合
    else
      if not Session.Connected then
        showmessage('接続に失敗しました')     //3回ログイン失敗するとここに来る
      else
        showmessage('接続に成功しました');

    if not Session.Connected then showmessage('とにかく接続できていません');
  end;

一般には、上記の「とにかく接続できていません」に相当する箇所で、Application.Terminate
などとなるでしょう。

設計時のデータベース接続支援

Delphiによるクライアントアプリケーション開発では、実行時のみならず設計時にもデータベースに接続して、データセットを開いてデータをDB対応コントロールに表示できる機能があり、大変に便利なものです。もちろんDOAも、設計時にデータベースに接続するのを可能にしています。

TOracleSession オブジェクトの、LogonUserName/LogonPassword/LogonDatabase
をセットしてConnectedプロパティをTrueにすれば、実際接続できるのですが、開発環境のデータベース名やユーザIDをセットし、ConnectedプロパティをTrueにしたままで、誤ってアプリケーションを出荷してしまうという失敗が心配ですよね?

この問題を解決するのが、
TOracleSession
DesignConnectedプロパティです。

  • TOracleSession
    • property
      DesignConnected : Boolean :
      セットされている場合、実行時にConnected/LogonUserName/LogonPassword/LogonDatabase
      の四つのプロパティをクリアします
      DesignConnectedをTrueにしておけば、配布したアプリケーションが開発環境に接続してしまう事故は完全に防げます。