アクセス97のインストール無しの環境で
DelphiからMDBを操作できるでしょうか。
できれば、BDEのインストールもしたくないのですが、
そんなことは可能でしょうか。
MDACだけでMDBを操作するツールもありますから、できると思います。
参考サイト
http://www.f3.dion.ne.jp/~element/msaccess/AcTipsGnrHowToUseJetWithoutMSAccess.html
ありがとうございます。
「タダ!」が強調されていました。
var
oleEG : Variant;
begin
oleEG := CreateOleObject('DAO.DBEngine.35');
のようなことがやりたいのです、アクセス97.MDBなのでJet3.5です。
これらの必要なDLLだけをインストールプログラムに含めて
配布するというのはオッケーなのでしょうか。
(まだ、なにが必要なファイルなのか理解していませんが)
マイクロソフトが、再配布可能なインストーラ「MDAC_TYP.EXE」を公開していますので、これを使った方がよろしいかと思います。
CreateOleObjectで作成するほかにも、tlibimpでインポートするという手もありますよ。
うちにある最古の MDAC_TYP.EXEは Ver2.1で VisualStudio6.0 SP3 に含まれていたのですが
これがどうも Jet4.0(MSJET40.DLL)のようでした。
幸い VB5 と アクセス97があるので MSJET35.DLL はあるのですが、
配布するとなると、どの Verの MDAC_TYP.EXE を用意すればいいでしょうか。
また、アクセス97がインストールされていない Win98環境で
MSJET35.DLL MSJINT35.DLL MSJTER35.DLL をシステムフォルダにコピーして
DAO350.DLL を Common Files にコピーして REGSVR32 した後、
プログラムを実行させると 「OleErr 80040112」が発生してしまいます。
同様のWin2000環境では「クラスを使用するための使用許可がありません」と表示されました
何かが足らないようなんですが、なんなんでしょうか…
こちらが参考になるかと。
http://support.microsoft.com/default.aspx?scid=kb;ja;JP240377
いろいろ試してみて、何とか動かすことが出来ました。
Windows98環境用にバッチファイルを作りました。
OSインストール直後状態でテストしました。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
@echo off
md "C:\Program Files\Common Files\Microsoft Shared\DAO"
copy DAO350.DLL "C:\Program Files\Common Files\Microsoft Shared\DAO"
%windir%\system\regsvr32 "C:\Program Files\Common Files\Microsoft Shared\DAO\DAO350.DLL"
COPY MSJET35.DLL %windir%\system
COPY MSJINT35.DLL %windir%\system
COPY MSJTER35.DLL %windir%\system
COPY VBAJET32.DLL %windir%\system
COPY EXPSRV.DLL %windir%\system
COPY VBAR332.DLL %windir%\system
echo REGEDIT4>LIC.REG
echo [HKEY_CLASSES_ROOT\Licenses\F4FC596D-DFFE-11CF-9551-0AA00A3DC45]>>LIC.REG
echo @="mbmabptebkjcdlgtjmskjwtsdhjbmkmwtrak">>LIC.REG
start LIC.REG
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
実行を確認したファイルの詳細
DAO350.DLL … 1997/05/26 00:00 (582,144)
MSJET35.DLL … 1997/05/26 00:00 (1,039,360)
MSJINT35.DLL … 1997/01/13 00:00 (38,160)
MSJTER35.DLL … 1997/05/26 00:00 (24,336)
VBAJET32.DLL … 2003/08/02 17:26 (30,749)
EXPSRV.DLL … 2003/08/02 17:26 (380,957)
VBAR332.DLL … 1997/05/26 00:00 (368,912)
DAO350.DLL 以外のファイルはオフィス97CDの
\Valupack\Dataacc\Dataacc.exe を実行すると
システムフォルダにインストールされます。
これらは InstallShield Express4.0 の Jet351Japanese.msi
に含まれているので再配布可能ファイルのようです。
DAO350.DLL はどこから調達すればいいのかわかりません。
─────────────────────────────
で、実際のプログラムの内容はというと、
固定長テキストファイル(40000件以上)をアクセス97.MDB に
登録するというもので、メインのプログラムはVB5で作られており、
メインから呼ばれるツールになります。
現在、そのツールの実行途中に
「テンポラリファイルのための空き容量が不足しています」
または「メモリ不足です」エラーが発生してしまい、困っております。
(続く)
簡素化したソースは以下のとおりです。
使用メモリ状態をグラフ表示する監視ソフトを実行させて確認したところ、
BeginTransメソッドを使用すると傾斜角25度位で
みるみるメモリが消費されていくのが判りました。
BeginTransと止めて実行したところ、メモリ消費スピードは抑えられたものの
40900件終了した時点で、約40MB位のメモリを消費しています。(Cerelon400,RAM256)
登録が全部終わり、ツール画面はまだ表示されたままの状態で、空きメモリは徐々に元に戻りました。
なにか命令を追加すれば実行時のメモリの消費を抑えられるでしょうか。
var
UsFp : textfile;
oleEG : variant;
oleWS : variant;
oleDB : variant;
oleRS : variant;
strSQL : string;
begin
try
oleEG := CreateOleObject('DAO.DBEngine.35');
oleWS := oleEG.Workspaces[0];
oleDB := oleWS.OpenDatabase( 'ACC97.MDB', False, False);
oleDB.BeginTrans;
while not eof(UsFp) do // 固定長テキストの読み込みループ
begin
Readln(UsFp,…);
Application.ProcessMessages;
strSQL := 'SELECT CODE FROM MASTERTABLE WHERE …';
oleRS := oleDB.OpenRecordset(strSQL);
if oleRS.EOF then strSQL := 'INSERT INTO MASTERTABLE VALUES ( ……'
else strSQL := 'UPDATE MASTERTABLE SET ……';
oleDB.Execute(strSQL,128);
// 128 = dbFailOnError エラー発生時は自動的にロールバック
end;
oleDB.CommitTrans;
Result := True;
except
on E : Exception do
begin
ShowMessage(E.Message + CRCR +'【' + E.ClassName + '】' + CRCR
+ '【' + strSQL + '】' + CRCR
+ 'エラーが発生したのでデータの更新を元に戻します。');
oleDB.Rollback;
Result := false;
end;
end;
end;
タイトルの内容に関しては参考リンクを頂いたことで解決いたしました。
ありがとうございました。今後もよろしくお願いいたします。
ツイート | ![]() |