MDBにInsertで「メモリ不足です」

このQ&Aのポイント
  • XP上のmdbファイル(2003形式)にDelphi7で作成したプログラムからADO(TADOConnection)で接続しています。使い方は通信のログをmdbに追加していくというものです。
  • 600~700件程度追加すると「メモリ不足です」というエラーが出て追加できなくなってしまいます。しかし、プログラムを再起動すると、動くようになります。
  • レジストリからMaxLocksPerFileの値を変更したり、TADOConnectionのオブジェクトを解放して再作成するなどの対策を試しましたが、効果はありませんでした。原因と対策をご存知の方がいらしたら、よろしくお願いします。
回答を見る
  • ベストアンサー

mdbにInsertで「メモリ不足です」

XP上のmdbファイル(2003形式)にDelphi7で作成したプログラムからADO(TADOConnection)で接続しています。 使い方は通信のログをmdbに追加していくというものです。 最初は動いているのですが、600~700件程度追加すると「メモリ不足です」というエラーが出て追加できなくなってしまいます。 しかし、プログラムを再起動すると、動くようになります。 メモリの状態を確認すると、 起動直後 約270MB ⇒ エラー発生時 約360MB で、メモリはまだまだ余裕があるように見受けられます。 検索して調べたところ、レジストリからMaxLocksPerFileの値を変更する方法があったため、 9500 ⇒ 200000 ⇒ 6000000 のように増やしてみましたが、効果はありませんでした。 また、ある程度動かしたら、TADOConnectionのオブジェクトを解放して再作成するように変更してみましたが、こちらも効果はありませんでした。(メモリも減っていない。キャッシュされている?) 以前はデータベースにSQL Serverを使っていたのですが、 諸事情でmdbに変更することになりました。 SQL Serverのときはこのような問題はありませんでした。 その他の情報は以下の通りです。 メモリ:512MB プロバイダ:Microsoft Jet 4.0 OLE DB Provider 原因と対策をご存知の方がいらしたら、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • wormhole
  • ベストアンサー率28% (1622/5658)
回答No.1

mdbの制限は調べられましたか? http://support.microsoft.com/kb/965659/ja

pentaro_2000
質問者

お礼

回答ありがとうございます。 テーブル数もカラム数も少ないため、制限には掛からないと思っていましたが、 制限の項目数が多そうですので、もう少し調べてみます。

関連するQ&A

  • ASPで,mdbファイルへのinsert文のエラー

    ASPで,guestbook.mdbファイルへ接続,はOK, そしてinsert文で新規レコードを追加しようとすると エラーが出てしまいます。 select文は使えるのですが。 エラーの内容は, エラー タイプ Microsoft OLE DB Provider for ODBC Drivers (0x80004005) [Microsoft][ODBC Microsoft Access Driver] 更新可能なクエリであることが必要です。 /asp_server/toda/guestbook.asp, line 24 です。 dbへの接続方法は, '***** データベース(guestbook.mdb)に接続 ***** Set ObjConn = Server.CreateObject("ADODB.Connection") ObjConn.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & _ Server.Mappath("guestbook.mdb") です。 問題は, '***** 名前とメッセージが空白でないときはデータ追加SQLを実行 ***** StrSQL = "insert into T_Message (name, word, entrydate) " & _ "values ('" & name & "','" & word & "',#" & entrydate & "#)" ObjConn.Execute(StrSQL) ここの,ObjConn.Execute(StrSQL)でエラーが起こります。 なぜエラーが出るのでしょうか。原因と対処方法をおしえていただけませんでしょうか? 「更新可能なクエリであることが必要です。」というエラーなので何かの設定の問題でしょうか?

  • Access2003でメモリ不足になります。

     Access2003をクライアントに、Oracle9iをDBサーバとして2層クライアントサーバシステムを会社で運用しています。しかし、Access2003のMDBを4つ同時に立ち上げて業務を行うためか、3時間でメモリ使用量が500MBになります。端末の物理メモリ容量は512MBのため、3時間で動作がとても緩慢になってしまいます。  MDBからDBサーバへのアクセス作業を行ううちに、メモリが完全に解放されずに残るケースがあり、それが蓄積されているようです。データベースへの参照(SELECT)よりも、書き込み処理(INSERT, UPDATE,DELETE)を行った後に使用メモリの蓄積が発生しやすいです。  また、フォームの開閉時よりも、別のMDBにフォーカスを移すと、メモリの解放が行われず、メモリの蓄積が発生しているようです。複数のMDBを起動している場合、一番最後のMDBを終了させるとメモリ使用量が元に戻ります。  背景としましては、最近、会社の基幹システムを刷新しました。刷新したといっても、ソースコードは変更せずに、Oracle7.2 Server/Access97で動作していたクライアントサーバシステムを、Oracle9.2 Server/Access2003に変更し、その変更に伴い動作がおかしくなる部分を修正しただけです。  MDBを複数立ち上げなくてはならないのは、とても基幹システムの規模が保守につぐ保守で大きくなってしまったため、MDBを機能単位で分割しているからです。  Access2003からOracle9.2へのアクセスはODBCを利用しています。クライアントのOSはWindows2000Professional sp4、サーバOSはWindowsServer2003、Oracle9.2はStandard Editionです。  Access97時代にはこれほどのメモリ使用量にはならず、現在はお昼休みに全てのMDBをいったん終了してから再度使用する運用でなんとか切り抜けています。  どなたか解決のヒントをご教授いただければ幸いです。

  • BULK INSERTで失敗

    SQL Server2000のSQL クエリアナライザから、 BULK INSERTを行おうとすると 以下のエラーメッセージが出力されます。 ------------------------------------- サーバー : メッセージ 7302、レベル 16、状態 1、行 1 OLE DB プロバイダ 'BULKIMPORTSTREAM' のインターフェイスを作成できませんでした。 OLE DB エラー トレース [Non-interface error: CoCreate of DSO for BULKIMPORTSTREAM returned 0x8007045a]。 ------------------------------------- 何が不足しているのでしょうか.

  • 他のMDBのテーブルに追加したい

    Access2010のADOについてご質問します。 以下のようにして、データを追加しています。 Dim SQL As String Dim cn As ADODB.Connection Set cn = CurrentProject.Connection ' SQL = "INSERT INTO テーブルA ( 勤務時間 ) " SQL = SQL & "SELECT [テーブルA ].[勤務時間] " SQL = SQL & "FROM テーブルA ; " cn.Execute SQL ご質問したいのは、 当MDB(PC)から社内サーバーにあるMDBのテーブルに追加したいのです。 違うテーブル名でしたら、リンクをすれば済む話とは思いますが 同じテーブル名の「テーブルA」なので どのようにすればいいのか困っています。 ご指導の程をよろしくお願いします。

  • VBAでmdbファイルを新規作成する方法。

    すみませんが、教えてください。 EXCEL VBA + ACCESS でプログラミングしています。 プログラム実行時、mdbファイルを新規に作成し、 そこに、既存のmdbファイルより、テーブルをエクスポートさせたいのですが、 いろいろと、方法があるようで、どうすれば良いのか、判断しかねています。 SQL+ADO でACCESSを操作することを基本方針で、プログラムしています。 このような場合、上記のようなことを実現するためには、どのようなアプローチをとるのが、スマートな方法なのでしょうか? 周りに、詳しい人がおらず困っています。 すみませんが、よろしくお願いいたします。

  • ACCESS2000:MDBのUPDATE

    ACCESS2000で作成したMDBがあります。 修正、変更が頻繁にあり、そのつど新しいバージョンを配布しているのですが、差分というか変更、追加した部分(フォームやVBAなど)だけUPDATE用のプログラムを動かしてもらえるようになればものすごく楽です。 そのようなパッチ作成プログラム?(差分ファイルを変更するプログラム)の作りかたが載っているサイトや、作るためのプログラムがありましたらお教えください。 よろしくお願いいたします。

  • mdbのテーブルを別のmdbのテーブルに追加

    2種類のMDBがあり 一つは 毎日の入力にて使用、もう一つは 累積として使用している。 それぞれに 同一デザインのテーブルがあります。 毎日の入力用のMDB内ののテーブルのデータをすべて 二つ目のMDBのテーブルに 追加したいのですが 一件読み込んで 一件書き込むなどと プログラムしていましたが 毎日の入力用のMDBが たくさんになったため 処理が遅くてたいへんです。 なにか 簡単に かつ 高速にすることは可能でしょうか? 開発環境は VB6 SP6 WindowsXP ADOを使用しています。 よろしくお願いします。

  • メモリ不足です。

    VBAのADOで For i = 1 To rs.RecordCount の部分で 実行時エラー -2147024882(8007000e) メモリ不足です。 になります。 同じコードでも今までは問題なく動いてました。 この状態になったら、一度再起動するしかないのでしょうか? アクセス2010です。

  • レコードセットの値 SelectとINSERT,UPDATE,Deleteで異なる?

    VB6でSQL Server2005をADOでアクセスしていますが、基本的なことですが、SELECT文の場合はrs.closeしてもエラーになりませんが、INSERT,UPDATE,DELETEの場合は、rs.closeとすると、 実行時エラー3704 オブジェクトが閉じている場合は、操作は許可されません。 というエラーメッセージが表示されます。 SQLは以下のように実行しています。 Call rs.Open(cobSQL.Text, cn, adLockOptimistic) VB6でSQL SERVER2005(もしくは2000)でデータベースアプリを作成するのに参考になる良書などご存知でしたら教えてください。 また、VB6でADOは、ネイティブにSQL Server2005にアクセスできるのでしょうか?まだADOやデータベースの概念が良くわかっていないため、質問自体がおかしいかもしれませんが、VB6で高速にSQL SERVER 2005で処理させたいのが私の現時点での目標です。

  • DBとMDB2接続

    DB接続していたものをMDB2接続に変更し、INSERTを行うとエラーが発生しています。 DB接続時はMySQL、MDB2接続ではsql Server を使用しています。 INT型でNULL禁止になっているところに値をNULL(もしくは空文字)で入れると(INSERT直前の値をvar_dumpするとSTRING(0) = > "" となっています)、DB接続の場合は0が登録されています。 文字列型の箇所には0ではなく、そのまま空文字として登録されています。 MDB2接続の場合は、下記のエラーが発生しています。 Error converting data type nvarchar to numeric ソースや使用していすシステムは都合により、掲載できないのですが、質問したいことは、 1、DB接続だと空文字を0に変換する機能になっている? 2、MySQLの使用で空文字を0に変換する?sql Serverだとならないのか。 もしMDB2接続で上記のエラーに対する対策方法があれば教えていただけますか? なお、一つ一つ変更するのが、簡単ですが、量が多いので極力避けたいと考えています。 よろしくお願いいたします。