アクセスのインストール無しでMDBの操作はできますか

解決


固まる  2004-03-17 01:17:27  No: 7690

アクセス97のインストール無しの環境で
DelphiからMDBを操作できるでしょうか。
できれば、BDEのインストールもしたくないのですが、
そんなことは可能でしょうか。


にしの  2004-03-17 02:02:21  No: 7691

MDACだけでMDBを操作するツールもありますから、できると思います。
参考サイト
http://www.f3.dion.ne.jp/~element/msaccess/AcTipsGnrHowToUseJetWithoutMSAccess.html


固まる  2004-03-17 03:36:55  No: 7692

ありがとうございます。
「タダ!」が強調されていました。

var
  oleEG : Variant;
begin
  oleEG := CreateOleObject('DAO.DBEngine.35');

のようなことがやりたいのです、アクセス97.MDBなのでJet3.5です。

これらの必要なDLLだけをインストールプログラムに含めて
配布するというのはオッケーなのでしょうか。
(まだ、なにが必要なファイルなのか理解していませんが)


にしの  2004-03-17 05:22:31  No: 7693

マイクロソフトが、再配布可能なインストーラ「MDAC_TYP.EXE」を公開していますので、これを使った方がよろしいかと思います。
CreateOleObjectで作成するほかにも、tlibimpでインポートするという手もありますよ。


固まる  2004-03-17 22:02:05  No: 7694

うちにある最古の 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環境では「クラスを使用するための使用許可がありません」と表示されました
何かが足らないようなんですが、なんなんでしょうか…


にしの  2004-03-17 23:12:17  No: 7695

こちらが参考になるかと。
http://support.microsoft.com/default.aspx?scid=kb;ja;JP240377


固まる  2004-03-20 02:46:27  No: 7696

いろいろ試してみて、何とか動かすことが出来ました。
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で作られており、
メインから呼ばれるツールになります。

現在、そのツールの実行途中に
「テンポラリファイルのための空き容量が不足しています」
または「メモリ不足です」エラーが発生してしまい、困っております。

(続く)


固まる  2004-03-23 22:30:47  No: 7697

簡素化したソースは以下のとおりです。
使用メモリ状態をグラフ表示する監視ソフトを実行させて確認したところ、
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;


固まる  2004-03-24 17:59:10  No: 7698

タイトルの内容に関しては参考リンクを頂いたことで解決いたしました。
ありがとうございました。今後もよろしくお願いいたします。


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

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






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