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 |