Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2010年05月15日] [更新 2017年01月13日] Delphi サンプルプログラム集
634_ADO で Oracle データベースに接続
動作確認等 Windows XP(SP3) + Delphi 2010(UP5) Pro + Oracle 8.1.6
634_ADO_Oracle.zip [1,344 KB] 2010年06月04日版 (EXE 同梱)



  • 2010年06月04日
  • サンプルプログラムを追加して記事も追加・修正




ADO で Oracle データベースに接続


ADO で Oracle に接続するテストプログラムです.
ADO による接続は,Oracle の機能を十分に生かすことはできませんが,接続は可能です.
他の ADO 関係のサンプルとの違いは接続文字列です.マイクロソフトの ADO 関係記事へのリンクが他の ADO 関係のサンプルプログラムの記事にあります.


[備考 1]
ADO を使用した接続以外で C/S (クライアント/サーバ) 型のデータベースを構築するには,一般的には Enterprise 版以上の Delphi が必要です.DOA (Direct Oracle Access) というコンポーネントを使用すると,Professional 版で C/S 型のデータベースを構築することができます.ただし,Oracle に限られます.
国内では Teppi Technology (鉄飛テクノロジー) が販売代理を行っています.
SI ObjectBrowser for Oracle というデータベース管理用の製品も便利です.SQL の実行,テーブルの作成や各種操作,データの編集,ストアドプログラムのデバッグ等が GUI で操作できます.

[備考 2]
Paradox や JET エンジンデータベース (Microsoft Access が使用しているデータベース) ではインデックスがなくてもそれなりのパフォーマンスが得られますが,一般的には,データベースの表は,インデックスが適切でないと十分なパフォーマンスが得られません.
インデックスが適切でないと,Orcale の場合,数 10 のレコード数の表に対する SQL 文の実行にも,信じられないほどの時間がかかることがあります.

[備考 3]
筆者が初めて使用した Delphi は 3.1 でした.BDE + Paradox でデータベースを構築しましたが,数ヵ月後には DOA + Oracle に移行しています.BDE + Paradox を業務アプリで使用するのはかなりの無理があります.また,使用可能な SQL にも不満がありました.
Oracle はコストがかかるイメージがありますが,クライアント数等によるロイヤルティにかかる費用を考慮すると,比較の対象としては適しているとは言えませんが,例えば,Microsoft Access を導入するよりもコストを抑えることができます.


図1
Oracle 起動
  • テストに使用した Oracle 8.1.6 は XP はサポート外.自動起動は不可なので手動起動
  • 実際には BAT ファイルを実行

以下は,サンプルプログラム集の ADO 関係の記事へのリンクです.





01_プロバイダに MSDAORA を使用した場合


マイクロソフト製の Oracle 用プロバイダである [Microsoft OLE DB Provider for Oracle] を使用して接続するサンプルです.
このサンプルは,筆者の環境ではアプリケーションを閉じた後,CPU ウインドウが表示されます.何らかのエラーが発生しているようですが詳細は調べていません.作成した EXE を実行する限りではエラー表示が現れません.
まずは,接続のテストをしてみます.

TADOConnection コンポーネントの オブジェクト・インスペクタで,ConnectionString の右の省略ボタンをクリックするか,TADOConnection コンポーネントをダブルクリックします.
表示したダイアログの [ビルド] ボタンをクリックして,下図のダイアログを表示します.


[備考]
Microsoft OLE DB Provider for Oracle の場合,Provider 名は MSDAORA.1 ですが,MSDAORA.1 では接続きないことがあるようです.その場合は,次項で説明している専用のプロバイダの設定で接続してみてください.


図2
プロバイダの選択
  • TADOConnection コンポをダブルクリック
  • 表示ダイアログで [ビルド] をクリック
  • Microsoft OLE DB Provider for Oracle
図3
接続テスト
  • 有名な SCOTT で接続
  • 接続に成功したら,オブジェクトインスペクタの ConnectionString プロパティを空にする

接続可能なことを確認したので,この接続文字列をコード内に書きます.
オブジェクト・インスペクタの TADOConnection の ConnectionString プロパティは空白にします.空白にしておかないと,実行時に接続できません.


図4
設計時画面
図5
実行してデータを表示

リスト1
ADO で Oracle に接続
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, ADODB, Grids, DBGrids, ExtCtrls;

type
  TForm1 = class(TForm)
    DBGrid1: TDBGrid;
    ADOConnection1: TADOConnection;
    ADOQuery1: TADOQuery;
    Panel1: TPanel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    DataSource1: TDataSource;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

//=============================================================================
//  開始時の処理
//=============================================================================
procedure TForm1.FormShow(Sender: TObject);
begin
  Button2.Enabled := False;
  Button3.Enabled := False;
end;

//=============================================================================
//  フォームを閉じる時はDBも切断
//=============================================================================
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  ADOConnection1.Connected := False;
end;

//=============================================================================
//  接続
//  テストなのでオブジェクト・インスペクタではなくコードで設定 
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  DataBase : String;
  UserID   : String;
  Password : String;
begin
    if Form2.ShowModal = mrOk then begin
      Update;
      if ADOConnection1.Connected then ADOConnection1.Connected := False;

      DataBase := Trim(Form2.LabeledEdit1.Text);
      UserID   := Trim(Form2.LabeledEdit2.Text);
      Password := Trim(Form2.LabeledEdit3.Text);

      ADOQuery1.Connection := ADOConnection1;
      DataSource1.DataSet  := ADOQuery1;
      DBGrid1.DataSource   := DataSource1;

      //ConnectionStringの設定
      ADOConnection1.Provider         := 'MSDAORA.1';
      ADOConnection1.ConnectionString := 'Data Source=' + DataBase +
                                         ';User ID='    + UserID   +
                                         ';Password='   + Password;

      //接続
      //なくてもクエリーを実行すれば接続する
      ADOConnection1.Connected := True;
    end;

  Button2.Enabled := ADOConnection1.Connected;
  Button3.Enabled := ADOConnection1.Connected;
end;

//=============================================================================
//  クエリー実行
//  テストなのでTADOConnectionの確認は行わない
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
begin
  with ADOQuery1 do begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT * FROM EMP');
    Open;
  end;
end;

//=============================================================================
//  切断
//=============================================================================
procedure TForm1.Button3Click(Sender: TObject);
begin
  ADOConnection1.Connected := False;

  Button2.Enabled := ADOConnection1.Connected;
  Button3.Enabled := ADOConnection1.Connected;
end;

end.


リスト2
パスワード等の入力用
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm2 = class(TForm)
    LabeledEdit1 : TLabeledEdit;
    LabeledEdit2 : TLabeledEdit;
    LabeledEdit3 : TLabeledEdit;
    Button1: TButton;
    Button2: TButton;
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private 宣言 }
    IniFileName  : String;
  public
    { Public 宣言 }
    DataBase : String;
    UserID   : String;
    Password : String;
  end;

var
  Form2: TForm2;

implementation

uses IniFiles;

{$R *.dfm}

//=============================================================================
//  設定をIniファイルから読出し
//=============================================================================
procedure TForm2.FormShow(Sender: TObject);
var
    AIni : TInifile;
begin
    IniFileName := ExtractFilePath(ParamStr(0)) + 'Login.ini';
    AIni := TIniFile.Create(IniFileName);
    try
     if FileExists(IniFileName) then begin
       LabeledEdit1.Text := AIni.ReadString('DBInfo', 'DataBase', '');
       LabeledEdit2.Text := AIni.ReadString('DBInfo', 'UserID',   '');
       LabeledEdit3.Text := AIni.ReadString('DBInfo', 'Password', '');
     end else begin
       LabeledEdit1.Text := 'ORACLEDB';
       LabeledEdit2.Text := 'SCOTT';
       LabeledEdit3.Text := 'TIGER';
     end;
    finally
      FreeAndNil(AIni);
    end;
end;
//=============================================================================
//  設定をIniファイルに保存
//=============================================================================
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
var
    AIni : TInifile;
begin
  if ModalResult = mrOk then begin
    AIni := TIniFile.Create(IniFileName);
    try
      try
        AIni.WriteString('DBInfo','DataBase', LabeledEdit1.Text);
        AIni.WriteString('DBInfo','UserID',   LabeledEdit2.Text);
        AIni.WriteString('DbInfo','PassWord', LabeledEdit3.Text);
      except
      end;
    finally
      FreeAndNil(AIni);
    end;
  end;
end;

end.




02_対象データベース専用のプロバイダ設定


TADOConnection コンポーネントの オブジェクト・インスペクタで,ConnectionString の右の省略ボタンをクリックするか,TADOConnection コンポーネントをダブルクリックします. 表示したダイアログの [ビルド] ボタンをクリックして,下図のダイアログを表示します.

データベースをインストールすると,そのデータベースのプロバイダ名が下図のようにリストに追加される場合があります.この図では Oracle の [Oracle Provider for OLE DB] です.これを使用したサンプルです.
このプロバイダ名は,データベースのバージョンによっても変わる場合がありますので,データリンクプロパティダイアログで設定して,生成された接続文字列を確認することが必要です.
かって筆者がデータベースのいろいろなテストをしていた頃は,このリストには多くのプロバイダ名が表示されていましたが,他のマシンに環境を移動した結果,現在はご覧のようにスッキリしています.

これも接続テストの結果接続できたので,この文字列を接続用に使用します.設計時も実行結果も前のサンプルと全く同じです.
接続の確認ができたら,接続の設定は,実行時にコードで行いますので,オブジェクト・インスペクタの TADOConnection の ConnectionString プロパティは空白にしておきます.


図6
OLE DBプロバイダのリスト
  • TADOConnection コンポをダブルクリック
  • 表示ダイアログで [ビルド] をクリック
  • Oracle Provider for OLE DB
  • 設計時に接続のテストをした場合は,オブジェクトインスペクタの ConnectionString プロパティを空にする

リスト3
ADO で Oracle 製の OLE DB プロバイダで接続
前のサンプルコードと違うのは ADOConnection1.Provider の行のみ
ログイン画面のコードも前のサンプルと同じ
//=============================================================================
//  接続
//  テストなのでオブジェクト・インスペクタではなくコードで設定 
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  DataBase : String;
  UserID   : String;
  Password : String;
begin
  Form2 := TForm2.Create(Self);
  try
    if Form2.ShowModal = mrOk then begin
      Update;
      if ADOConnection1.Connected then ADOConnection1.Connected := False;

      DataBase := Trim(Form2.LabeledEdit1.Text);
      UserID   := Trim(Form2.LabeledEdit2.Text);
      Password := Trim(Form2.LabeledEdit3.Text);

      ADOQuery1.Connection := ADOConnection1;
      DataSource1.DataSet  := ADOQuery1;
      DBGrid1.DataSource   := DataSource1;

      //ConnectionStringの設定
      ADOConnection1.Provider         := 'OraOLEDB.Oracle.1';
      ADOConnection1.ConnectionString := 'Data Source=' + DataBase +
                                         ';User ID='    + UserID   +
                                         ';Password='   + Password;
      //接続
      //なくてもクエリーを実行すれば接続する
      ADOConnection1.Connected := True;
    end;
  finally
    FreeAndNil(Form2);
  end;

  Button2.Enabled := ADOConnection1.Connected;
  Button3.Enabled := ADOConnection1.Connected;
end;




03_エクセルやテキストファイルのエクスポートとインポート


プロバイダの指定が JET 関係以外の場合,他の ADO 関係のサンプルプログラムと同じようなコードではできません.
Oracle に限らず,データベースあるいはそのアクセス用のコントロールで,エクスポートやインポートをサポートしている場合があります.またユーティリティが付属していることもあります.