[BlueLeaf1336]> PROGRAM>

Delphiでmdbを操作 - 001

historyTOP

2004/05/07:作成
2004/05/08:最適化シリーズ整理。

overviewTOP

タイトルのとおりDelphiでmdbを操作しようというページです。まったくもってイマサラ感がぬぐえませんが、いつもGoogleで探し回っているのでいつか役に立つだろうと。

あ、先に書いときますが、基本的にパクリます。サンプルなんて腐るほどWEB上に転がってますんで。ただし、このページでは参考にすると呼称します(プ)。

それから、基本的なプロジェクトの構成はこんな感じで。

ファイル名役割
OpeMdb.dprプロジェクトファイル
Main.***フォームファイル/フォームユニット
mdb.pasmdb操作関係の処理を集めたユニット

文中の、try..finally/try..except にはそれほどの自信はありません。とりあえず捕まえてるだけです。

このページでは、Delphiを使用して、mdbファイルを作成したりパスワードをかけたりパスワードを変更したりします。Windows2000でしか試していません。参考にしたサイトで見たままに、なんのポリシーもなくOleObjectをCreateしています。いつか痛い目を見そうです。

データベースを作るTOP

とりあえず、mdbを作るところから始めます。操作しようというのにAccessで作るってのはアレなので。で、参考URL。もろです。

重要そうなところを強調したので逆に見にくくなってますが。

uses
    Windows, SysUtils, ComObj, ActiveX, Variants;

//  ---------------------------------------------------------------------------
//  データベース作成
function    CreateDatabase(const Path: string; var Err: string): Boolean;
const
    CONN_STR = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source="%s"';
var
    Catalog: OleVariant;
    ConnStr: string;
begin
    Result := false;
    ConnStr := Format(CONN_STR, [Path]);
    try
        try
            Catalog := CreateOleObject('ADOX.Catalog');
            Catalog.Create(ConnStr);
        finally
            Catalog := Unassigned;
        end;
        Result := true;
    except
        on E:Exception do Err := E.Message;
    end;
end;

データベースを作るサンプルTOP

uses
    mdb;

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;

データベースにパスワードを設定する・パスワードを変更する・最適化するTOP

次に、データベースにパスワードを設定します。ただし、「パスワードが設定されていないデータベース」が対象です。つまり、このコードを試したデータベースは、このコードでは2度とパスワードを変更できません。あと、これ以降、uses 節は省略します。

(2004/05/08)これ以降、同じようなコードが続くことに気づいたので共通化しました。で、大幅に行数が削減されました。

//  ---------------------------------------------------------------------------
//  パスワードを設定・変更
function    ChangePassword(const Path, OldPath, NewPass: string; var Err: string): Boolean;
const
    CONN_STR = 'Data Source="%s";Jet OLEDB:Database Password=%s';
var
    Engine: OleVariant;
    Temp: string;
    S1, S2: string;
begin
    Result := false;
    //  圧縮先を指定
    Temp := ChangeFileExt(Path, '.bak');
    //  あれば消す(消してよいなら)
    DeleteFile(Temp);
    //  接続文字列風作成
    S1 := Format(CONN_STR, [Path, OldPath]);
    S2 := Format(CONN_STR, [Temp, NewPass]);
    try
        try
            //  やる
            Engine := CreateOleObject('JRO.JetEngine');
            Engine.CompactDatabase(S1, S2);
            //  置き換える
            DeleteFile(Path);
            RenameFile(Temp, Path);
        finally
            Engine := Unassigned;
        end;
        Result := true;
    except
        on E:Exception do Err := E.Message;
    end;
end;

//  ---------------------------------------------------------------------------
//  最適化
function    CompactDatabase(const Path, Pass: string; var Err: string): Boolean;
begin
    Result := ChangePassword(Path, Pass, Pass, Err);
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;

//  ---------------------------------------------------------------------------
//  初めてパスワードを設定する
procedure TForm1.Button2Click(Sender: TObject);
var
    ret: Boolean;
    Err: string;
begin
    ret := ChangePassword(ExtractFilePath(ParamStr(0)) + Edit1.Text,
                            '',             //  初めてなので空っぽ
                            Edit2.Text,     //  パスワードを指定
                            Err);
    if ret then ShowMessage('成功') else ShowMessage(Err);
end;

//  ---------------------------------------------------------------------------
//  パスワードを変更する
procedure TForm1.Button3Click(Sender: TObject);
var
    ret: Boolean;
    Err: string;
begin
    ret := ChangePassword(ExtractFilePath(ParamStr(0)) + Edit1.Text,
                            Edit3.Text,     //  現在のパスワード
                            Edit4.Text,     //  新しいパスワード
                            Err);
    if ret then ShowMessage('成功') else ShowMessage(Err);
end;

//  ---------------------------------------------------------------------------
//  最適化する
procedure TForm1.Button4Click(Sender: TObject);
var
    ret: Boolean;
    Err: string;
begin
    ret := CompactDatabase(ExtractFilePath(ParamStr(0)) + Edit1.Text,
                            Edit5.Text,     //  現在のパスワード
                            Err);
    if ret then ShowMessage('成功') else ShowMessage(Err);
end;

finalizationTOP

ヘチョサンプルでしたが、予想以上に行数が育ってしまったので、このページはここまでにします。

ソースダウンロード
20040508Opemdb.zip(174,145bytes)
※何も触らずに上から順にボタンを押していけば、このページで紹介している4つのサンプル(データベースを作成する、パスワードを設定する、パスワードを変更する、パスワードの設定されているデータベースを最適化する)を試すことができます。
エラーになれば捨ててください。

EOFTOP