| history | TOP |
2004/05/08:作成
| overview | TOP |
前回の続きです。ここでは主にデータベースを開けたり閉めたりテーブルを作ったり消したりする予定です。
で、開けたり閉めたりのサンプルを作るのに何度もデータベースオブジェクトを作成するのも邪魔くさいので、クラスにしてしまいます。といってもコンストラクタでファイルのパスをもらったら、後はそれを使いまわしますよ、という程度のものです。でも、ボタンクリックごとに開いて何かして閉じて、をちょっと違う内容を書くためだけに繰返すのもバカらしい。
というわけで。
| 参考にしたURL | TOP |
先に書いてしまいます。
| そのクラス | 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;
| finalization | TOP |
サンプルでの、コミットとロールバックの扱いが明らかにおかしいあたりは置いといてください。使えるよという程度です。
とりあえずクエリーが発行できるようになりました。飽きました。実際のところ1つのデータベースだけを見てできることは大体このぐらいですか? あと、いつか使いそうな気がしなくもないのは、リンクテーブルを操作するような何かですか? それから、当然 SELECT を扱えるようにならないと話にならないんですが、それはまたレコードセットの話になるので別の話と言える話かと思います。今日はこれまで。
ソースダウンロード
20040508Opemdb.zip(185,728bytes)
データベースを作成して、そのデータベースに対してクエリーを発行するためのサンプルです。が、取り出してみることは出来ないサンプルです。また、初めて「発行」ボタンを押した時はエラーになりますがもう1回押せば問題ありません。多分。データが入ったかどうかはAccessで確認してください(ここまで来て...)。
エラーになれば捨ててください。
| EOF | TOP |