[BlueLeaf1336]> PROGRAM>

Delphiでmdbを操作 - 002

historyTOP

2004/05/08:作成

overviewTOP

前回の続きです。ここでは主にデータベースを開けたり閉めたりテーブルを作ったり消したりする予定です。

で、開けたり閉めたりのサンプルを作るのに何度もデータベースオブジェクトを作成するのも邪魔くさいので、クラスにしてしまいます。といってもコンストラクタでファイルのパスをもらったら、後はそれを使いまわしますよ、という程度のものです。でも、ボタンクリックごとに開いて何かして閉じて、をちょっと違う内容を書くためだけに繰返すのもバカらしい。

というわけで。

参考にしたURLTOP

先に書いてしまいます。

そのクラスTOP

type
    TPoorMdb = class
    private
        OLE_DB      : OleVariant;
        FPath       : string;
        FPass       : string;
        FConnStr    : string;
    public
        constructor Create(const Path, Pass: string);
        destructor  Destroy(); override;
        function    Open(var Err: string): Boolean;
        procedure   Close();
        function    Execute(const SQL: string; var Err: string): Boolean;
        procedure   BeginTrans();
        procedure   Commit();
        procedure   Rollback();
    end;

//  ---------------------------------------------------------------------------
//  コンストラクタ
constructor TPoorMdb.Create(const Path, Pass: string);
const
    CONN_STR = 'Provider=Microsoft.Jet.OLEDB.4.0;'
             + 'Jet OLEDB:Database Password="%s";Data Source="%s"';
begin
    //  初期化
    OLE_DB := Unassigned;
    //  もらっておく
    FPath := Path;
    FPass := Pass;
    //  秘密の呪文作成
    FConnStr := Format(CONN_STR, [FPass, FPath]);
end;
//  ---------------------------------------------------------------------------
//  デストラクタ
destructor  TPoorMdb.Destroy();
begin
    //  念のため閉じておく
    Close();
end;
//  ---------------------------------------------------------------------------
//  開く
function    TPoorMdb.Open(var Err: string): Boolean;
begin
    Result := false;
    try
        //  接続(?)
        OLE_DB := CreateOleObject('ADODB.Connection');
        //  開く(.ldbが作成される)
        OLE_DB.Open(FConnStr);
        Result := true;
    except
        on E:Exception do
        begin
            Err := E.Message;
            //  初期化
            OLE_DB := Unassigned;
        end;
    end;
end;
//  ---------------------------------------------------------------------------
//  閉じる
procedure   TPoorMdb.Close();
begin
    //  もし接続しているなら
    if not VarIsEmpty(OLE_DB) then
    begin
        //  閉じて初期化
        OLE_DB.Close;
        OLE_DB := Unassigned;
    end;
end;
//  ---------------------------------------------------------------------------
//  クエリー発行
function    TPoorMdb.Execute(const SQL: string; var Err: string): Boolean;
begin
    Result := false;
    try
        OLE_DB.Execute(SQL);
        Result := true;
    except
        on E:Exception do Err := E.Message;
    end;
end;
//  ---------------------------------------------------------------------------
//  トランザクション開始
procedure   TPoorMdb.BeginTrans();
begin
    OLE_DB.BeginTrans;
end;
//  ---------------------------------------------------------------------------
//  コミット
procedure   TPoorMdb.Commit();
begin
    OLE_DB.CommitTrans;
end;
//  ---------------------------------------------------------------------------
//  ロールバック
procedure   TPoorMdb.Rollback();
begin
    OLE_DB.RollbackTrans;
end;

そのクラスの使用サンプルTOP

//  ---------------------------------------------------------------------------
//  データベースを作成
procedure TForm1.Button1Click(Sender: TObject);
var
    ret: Boolean;
    Err: string;
begin
    ret := CreateDatabase(ExtractFilePath(ParamStr(0)) + Edit1.Text, Err);
    if ret then ShowMessage('成功') else ShowMessage(Err);
end;

var
    DB: TPoorMdb = nil;

//  ---------------------------------------------------------------------------
//  データベースを開く
procedure TForm1.BitBtn1Click(Sender: TObject);
var
    ret: Boolean;
    Err: string;
begin
    DB := TPoorMdb.Create(ExtractFilePath(ParamStr(0)) + Edit1.Text, '');
    ret := DB.Open(Err);
    if ret then
    begin
        ShowMessage('成功');
        BitBtn1.Enabled := false;
        BitBtn2.Enabled := true;
        BitBtn3.Enabled := true;
    end
    else
    begin
        ShowMessage(Err);
    end;
end;

//  ---------------------------------------------------------------------------
//  データを操作する(テーブル作成・データ作成・更新・削除)
procedure TForm1.BitBtn2Click(Sender: TObject);
var
    i: integer;
    ret: Boolean;
    SQL, Err: string;
begin
    if (DB = nil) then exit;

    Screen.Cursor := crHourGlass;
    BitBtn2.Enabled := false;
    BitBtn3.Enabled := false;
    Memo2.Clear();
    //  トランザクションを開始
    DB.BeginTrans();
    try
        for i := 0 to Memo1.Lines.Count - 1 do
        begin
            //  1行ずつクエリーとして扱って
            SQL := Memo1.Lines[i];
            //  そのまま実行する
            ret := DB.Execute(SQL, Err);
            //  問題があれば表示する
            if not ret then Memo2.Lines.Add(Err);
        end;
        //  コミット
        DB.Commit();
    except
        on E:Exception do
        begin
            Memo2.Lines.Add(E.Message);
            try
                //  ロールバック
                DB.Rollback();
            except
                //  泥沼
                on E:Exception do Memo2.Lines.Add(E.Message);
            end;
        end;
    end;
    Screen.Cursor := crDefault;
    BitBtn2.Enabled := true;
    BitBtn3.Enabled := true;
end;

//  ---------------------------------------------------------------------------
//  データベースを閉じる
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
    if (DB = nil) then exit;
    DB.Close();
    DB.Free();
    DB := nil;
    BitBtn1.Enabled := true;
    BitBtn2.Enabled := false;
    BitBtn3.Enabled := false;
end;

finalizationTOP

サンプルでの、コミットとロールバックの扱いが明らかにおかしいあたりは置いといてください。使えるよという程度です。

とりあえずクエリーが発行できるようになりました。飽きました。実際のところ1つのデータベースだけを見てできることは大体このぐらいですか? あと、いつか使いそうな気がしなくもないのは、リンクテーブルを操作するような何かですか? それから、当然 SELECT を扱えるようにならないと話にならないんですが、それはまたレコードセットの話になるので別の話と言える話かと思います。今日はこれまで。

ソースダウンロード
20040508Opemdb.zip(185,728bytes)
データベースを作成して、そのデータベースに対してクエリーを発行するためのサンプルです。が、取り出してみることは出来ないサンプルです。また、初めて「発行」ボタンを押した時はエラーになりますがもう1回押せば問題ありません。多分。データが入ったかどうかはAccessで確認してください(ここまで来て...)。
エラーになれば捨ててください。

EOFTOP