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 関係のサンプルとの違いは接続文字列です.マイクロソフトの 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
実行してデータを表示
copy code
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 .
copy code
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 .
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 の行のみ
ログイン画面のコードも前のサンプルと同じ
copy code
// =============================================================================
// 接続
// テストなのでオブジェクト・インスペクタではなくコードで設定
// =============================================================================
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 に限らず,データベースあるいはそのアクセス用のコントロールで,エクスポートやインポートをサポートしている場合があります.またユーティリティが付属していることもあります.