いつもお世話になります。
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) で実行するためのソースコードまたはヒントをご教示いただけないでしょうか。
よろしくお願いします。
※説明が下手で申し訳ありません。
Dbi関数は、BDEネイティブな関数ですので、これを使わない場合は、
今までのファイルを削除して、同じ構造の別ファイルを作るしかないでしょう。
根本から処理の変更が必要ではないでしょうか?
MS-ACCESS/mdbは、テーブル個々でファイルとして存在していません。
最適化は、mdb自身の最適化であってテーブル毎に最適化は出来ません。
・テーブル個々での再構築と同等の処理は存在しないのでしない
・別なタイミングでのmdb自身の最適化の処理を考える
では?
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'
となります。
これに相当するメソッドは何になるのでしょうか。
ヘルプで調べてみたのですが、調べ方が悪いのか見つかりませんでした。
以上、よろしくお願いいたします。
>ヘルプで調べてみたのですが、調べ方が悪いのか見つかりませんでした。
ヘルプのキーワードで ADOTable
[Using TADOCommand]をクリック、(ADO データセットの使い方)が表示される。
ADO データセットには以下の 4 種類があります。
TADOTable。テーブルタイプのこのデータセットによって,(以下略)
(この行の[テーブルタイプ]をクリック)
下から2行目に テーブルを空にする というのがある。
というのは参考になりませんか。
それにしても、ADOTable1. で
Exclusive
EmptyTable
というのは、全く候補にでてこないのですが...
[エラー] 未定義の識別子: 'Exclusive'
[エラー] 未定義の識別子: 'EmptyTable'
EmptyTableは、テーブルを空にするメソッドですので、
毎回 空のテーブルを内包したMDBをコピーされるのであれば
不要ですね。
でなければ、自分でDELETE FROM そのテーブルでレコード削除するですね
Exclusiveは、排他制御ですねよ?
TADOTableで対応は、直接のプロパティは無いような気がします。
また、排他は接続するデータベースの機能に依存する部分も大きいので
(JETの場合、ページ排他だった様な・・)
全く同等にする必要があるか、処理も考える必要があるような気もします
ADOTable見ずに書いてましたが(すみません)、LockTypeプロパティが存在しますね。
参照してみて下ださい。
みなさん、どうもありがとうございました。
とても参考になりました。
あとはもう少し自分で調べてみます。
今後ともよろしくお願いいたします。
ツイート | ![]() |