データベースを初期化するには?

解決


めるめる  2007-03-08 08:01:38  No: 25208

いつもお世話になります。
WindowxXP/Delphi7 Professional

現在、BDE 経由で Paradox に接続しています。
Borland より今後はなるべく BDE および Paradox を使用しないようにとのことなので、
ADO および Jet4.0 (MS-ACCESS/mdb) を使用するようにプログラムを書き換えています。
具体的には、全ての BDEの"Table1" を ADOの"ADOTable1" に変更しました。
これでほぼ全て問題なく動作しているようです。
しかし、データベースの初期化する処理がよくわかりません。

下記が今まで BDE/Table1(Paradox) で実行していたコードです。
データベースを空にした後、データベースの圧縮(コンデンス)を実行したいのです。
※データベースを空にしただけではデータベースのサイズが小さくならないため

procedure TForm1.Button1Click(Sender: TObject);
var
  Props: CURProps;
  hDb: hDBIDb;
  TableDesc: CRTblDesc;
  W1: Integer;
begin
  W1 := MessageDlg('新規作成しますか?', mtInformation, [mbOK, mbCancel], -1);
  if (W1 <> 1) then exit;

  TableLc4.Close;
  TableLc4.ReadOnly := False;
  TableLc4.Exclusive := true;
  TableLc4.EmptyTable;
  TableLc4.Open;

  // テーブルのカーソルハンドルの取得
  DbiGetCursorProps(TableLc4.Handle, Props);
  // 構造体を空白にする
  FillChar(TableDesc, sizeof(TableDesc), 0);
  // テーブルのカーソルハンドルから,データベースハンドルを取得
  DbiGetObjFromObj(hDBIObj(TableLc4.Handle), objDATABASE, hDBIObj(hDb));
  // テーブルディスクリプタにテーブル名を格納
  StrPCopy(TableDesc.szTblName, TableLc4.TableName);
  // テーブルディスクリプタにテーブルの形式を格納
  StrPCopy(TableDesc.szTblType, Props.szTableType);
  // テーブルディスクリプタの Pack オプションを TRUE に設定
  TableDesc.bPack := true;
  // テーブルをクローズし,再構築を終了
  TableLc4.Close;
  // DbiDoRestructure 関数の呼び出し
  DbiDoRestructure(hDb, 1, @TableDesc, nil, nil, nil, false);

  TableLc4.Exclusive := False;
end;

これと同様の処理を ADO/ADOTable1 (Jet4.0 MS-ACCESS/mdb) で実行するためのソースコードまたはヒントをご教示いただけないでしょうか。
よろしくお願いします。

※説明が下手で申し訳ありません。


HOta  2007-03-08 19:00:06  No: 25209

Dbi関数は、BDEネイティブな関数ですので、これを使わない場合は、
今までのファイルを削除して、同じ構造の別ファイルを作るしかないでしょう。


AY  2007-03-08 20:53:39  No: 25210

根本から処理の変更が必要ではないでしょうか?
MS-ACCESS/mdbは、テーブル個々でファイルとして存在していません。
最適化は、mdb自身の最適化であってテーブル毎に最適化は出来ません。
・テーブル個々での再構築と同等の処理は存在しないのでしない
・別なタイミングでのmdb自身の最適化の処理を考える
では?


めるめる  2007-03-08 21:25:12  No: 25211

HOta様、AY様、ありがとうございます。
私もまだまだ勉強中ですので、今の私の技術のできる範囲で考えみます。

(1)1ファイル 1テーブルの mdb ファイルを作成する。
(2)上記と同一構造でデータ件数ゼロのファイルを別名でもう一つ作成しておく。
(3)テーブルを削除せずファイごと削除する。
(4) (2)で作成しておいたファイルをリネームしてコピーする。

かなり?恥ずかしい方法ですがとりあえずこれで回避してみます。

あと参考のためもう一つ教えていただきたいのですが、
  Table1.Close;
  Table1.ReadOnly := False;
  Table1.Exclusive := True;
  Table1.EmptyTable;
  Table1.Open;
これはOKです。

  ADOTable1.Close;
  ADOTable1.ReadOnly := False; 
  ADOTable1.Exclusive := True; 
  ADOTable1.EmptyTable;
  ADOTable1.Open;

[エラー] 未定義の識別子: 'Exclusive'
[エラー] 未定義の識別子: 'EmptyTable'
となります。
これに相当するメソッドは何になるのでしょうか。
ヘルプで調べてみたのですが、調べ方が悪いのか見つかりませんでした。

以上、よろしくお願いいたします。


Mr.XRAY  URL  2007-03-09 00:48:37  No: 25212

>ヘルプで調べてみたのですが、調べ方が悪いのか見つかりませんでした。

ヘルプのキーワードで  ADOTable  
[Using TADOCommand]をクリック、(ADO データセットの使い方)が表示される。

ADO データセットには以下の 4 種類があります。
TADOTable。テーブルタイプのこのデータセットによって,(以下略)
(この行の[テーブルタイプ]をクリック)

下から2行目に テーブルを空にする  というのがある。

というのは参考になりませんか。

それにしても、ADOTable1. で
Exclusive 
EmptyTable
というのは、全く候補にでてこないのですが...


AY  2007-03-09 01:30:29  No: 25213

[エラー] 未定義の識別子: 'Exclusive'
[エラー] 未定義の識別子: 'EmptyTable'

EmptyTableは、テーブルを空にするメソッドですので、
毎回  空のテーブルを内包したMDBをコピーされるのであれば
不要ですね。
でなければ、自分でDELETE FROM  そのテーブルでレコード削除するですね

Exclusiveは、排他制御ですねよ?
TADOTableで対応は、直接のプロパティは無いような気がします。
また、排他は接続するデータベースの機能に依存する部分も大きいので
(JETの場合、ページ排他だった様な・・)
全く同等にする必要があるか、処理も考える必要があるような気もします


AY  2007-03-09 01:35:28  No: 25214

ADOTable見ずに書いてましたが(すみません)、LockTypeプロパティが存在しますね。
参照してみて下ださい。


めるめる  2007-03-09 02:55:40  No: 25215

みなさん、どうもありがとうございました。
とても参考になりました。
あとはもう少し自分で調べてみます。
今後ともよろしくお願いいたします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加