• 締切済み

[性能改善]AccessのDBに大量のデータをUpdateする場合の性能対策について

初めまして。 早速質問なのですが、VB(6.0)でmdb(Access2000)のDBを更新する処理を作りました。 DAOを用いて(初めて使います)以下のような構文を作ったのですが、 性能がぱっとしません。 何か下記のソースをいじることで性能が改善するような手立てはありませんでしょうか? ---------------------------------------------------------------------- Sub Main()      Dim cDaoDB    As DAO.Database      Dim cDaoWS    As Workspace      Dim cColUpdate  As Collection      Dim varColItem  As Variant      Dim lngCnt    As Long      Set cDaoWS = DBEngine.Workspaces(0)      Set cDaoDB = mDaoWS.OpenDatabase("C:\TEST.mdb")      'コレクションにデータをaddする処理は省略しています      cColUpdate.add            With cDaoDB           cDaoWS.BeginTrans           'cColUpdateコレクションには10万件ほどのSQL構文(Update構文)が格納されています           '10万回ほど繰り返し処理します           For Each varColItem In cColUpdate                lngCnt = lngCnt + 1                If lngCnt > 1000 Then                     'データ量が多いため1000件ごとにコミットしています                     cDaoWS.CommitTrans                     cDaoWS.BeginTrans                     lngCnt = 0                End If                strErrSQL = varColItem                'Update処理が繰り返し流れます。                .Execute varColItem           Next           .Close           cDaoWS.Close      End With      Set cDaoDB = Nothing      Set cDaoWS = Nothing End Sub ---------------------------------------------------------------------- よろしくお願いします。

みんなの回答

noname#182251
noname#182251
回答No.1

どのような更新がやりたいのか良く判りませんが、10万回もSQLを繰り返せば当然遅いはずです。一つのSQLで不可能であれば、数個のSQLで処理できないのでしょうか。対象テーブルの構造や、更新の内容を提示すれば、それなりの回答がでるかと考えます。

sakura791
質問者

お礼

SQLの方を変更することになりました。 回答ありがとうざいました。

関連するQ&A

  • Access VBA 添付型フィールド

    Access VBAで添付型フィールドからファイル名を取りだしたいのですが、どのようにすればいいでしょうか? Private Sub Sample() Dim DB As DAO.Database Dim RS As DAO.Recordset Dim SQL As String   Set DB = CurrentDb SQL_1 = "SELECT * FROM ボランティア情報 ORDER BY 分野 & 団体名読み;" Set RS = DB.OpenRecordset(SQL_1, dbOpenDynaset) With RS   Do While Not .EOF   MsgBox (!写真.FileName)  ←ここでエラーが出ます。 .   MoveNext   Loop End With RS.Close Set RS = Nothing Set MDB = Nothing End Sub

  • DAO findfirst ついて教えてください。

    下記のように記述し実行しているのですが、  実行時エラー'3077'  式の構文エラー:演算子がありません というエラー(下記===>)がでます。別なTBLではちゃんとfindfirst を使い結果がでているのですが、このイベントだけうまくいきません。 ちなみに、findfirst行をコメントにするとTBL1行目を読み込んでくれます。 Private Sub in_lot_no_AfterUpdate() Dim dbDAO As DAO.Database Dim rsDAO As DAO.Recordset Dim wkJOUKEN As String Set dbDAO = OpenDatabase("\\Network-SV\factory.mdb") Set rsDAO = dbDAO.OpenRecordset("JI_NYUKAJI", dbOpenDynaset) wkJOUKEN = "LOTNO=" & Me!in_Lot_No  '非連結入力TXT-BOX ===>rsDAO.FindFirst wkJOUKEN If rsDAO.NoMatch Then MsgBox ("入荷情報が存在しません。") Else Me!in_nyuukaday = rsDAO![NYUKADAY] Me!in_shubetu = rsDAO![KATASIKI] End If rsDAO.Close: Set rsDAO = Nothing dbDAO.Close: Set dbDAO = Nothing End Sub 初心者ですがよろしくお願いいたします。

  • ハイパーリンク型の場合、エラーになります。

    DAOでテーブルを作成しようとすると ハイパーリンク型の場合、エラーになります。 Sub Sample() Dim db As DAO.Database Dim tbdef As DAO.TableDef Dim Field1 As DAO.Field Set db = CurrentDb Set tbdef = db.CreateTableDef("T_test") Set Field1 = tbdef.CreateField("氏名", dbHyperlinkField) tbdef.Fields.Append Field1 db.TableDefs.Append tbdef db.Close: Set db = Nothing End Sub Type プロパティ のヘルプを見ると、dbHyperlinkFieldはないのですが dbHyperlinkFieldではないのでしょうか? DAO.DataTypeEnum のメンバの中にもハイパーリンクはないようです。

  • テキストボックスに入れた内容をAccessのテーブルに登録する方法を教えてください。

    はじめまして。 VBでフォームに作ったテキストボックス(text1、text2、text3)に値を入れてコマンドボタンを押したらAccessのテーブルに値を登録できるようにしたいのですが上手くいきません。自分で調べながらコーディングしたのですが上手く動かずどうすれば動くのかVBのコーディングを教えていただきたいです。よろしくお願いします。 [Accessのファイル名] db1.mdb [db1.mdbのテーブル名] ListName [ListNameの各項目] 名前、住所、生年月日 [VBのフォーム] text1.textbox、text2.textbox、text3.textbox Add.command [コーディングの内容] Microsoft DAO 3.6 Object Library参照設定 Private Sub Add_Click() Dim strSQL As String Dim dbName As String Dim dbs As DAO.Database Dim myset As DAO.Recordset Dim ws As DAO.Workspace Set ws = DBEngine.Workspaces(0) Set dbs = ws.OpenDatabase("C:\db1.mdb") If Dir("C:\db1.mdb") <> "" Then strSQL = "INSERT INTO Listname (名前,生年月日, _ 住所) values(text1.text, text2.text, text3.text)" Me.AutoRedraw = True Set myset = dbs.OpenRecordset(strSQL) End If End Sub ※無効な処理です。というエラーが出ます。

  • Nothingを代入しないままNew

    VBAでコレクションの要素を一括削除する方法として、下記のコードが掲載されていましたが Nothingを代入しないままNewを使用しても問題ないでしょうか。 また、この辺りの挙動について詳しく書かれているサイトがありましたら、ご教示頂ければ幸いです。 Dim fruits As Collection Set fruits = New Collection With fruits Call .Add("バナナ") Call .Add("リンゴ") Call .Add("ミカン") End With Set fruits = New Collection

  • DAOでレコード数を取得したい(ACESSVBA)

    レコードの行数は複数あるのに --------------------------------------------------------- Sub あ() Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("T_test", dbOpenDynaset) MsgBox rs.RecordCount Set rs = Nothing Set db = Nothing End Sub --------------------------------------------------------- これでレコード数を取得しようとすると1がかえるのですが なぜレコードの行数を取得できないのでしょうか?

  • アクセス2000VBA DAOをADOに書き換えてください

    アクセス2000VBA DAOをADOに書き換えてください 下記プログラムをADOに書き換えてください。(DAT1、DAT2はモジュールにて定義してあります) Option Compare Database Dim DBS As Database Dim QDF As QueryDef Dim RST As DAO.Recordset Dim COUNT1 Private Sub Form_Load() On Error Resume Next DAT2 = [Forms]![伝票]![HAKKOU1] Set DBS = CurrentDb Set QDF = DBS.QueryDefs("発行") With QDF .Parameters("DAT1") = DAT2 ’もしかしたら DAT2 ではエラーがでるかもしれません。 Set RST = .OpenRecordset() ’正しい記述を教えてください .Close End With With RST COUNT1 = !指示書 .Close End With

  • ADOでレコードを閉じるタイミング。。Access2000/VB6/Win2K

    レコードセットを返すFuncitonプロシージャーを作ってみたのですが。。。 下のGet_Recordsの方のレコードセットをCloseすると上の方のDisp_Dataでオブ ジェクトが閉じているといって怒られます。しかし、閉じないと下の方では開きっ ぱなしになると思うのですが。。。どのように処理すればいいのでしょうか? Public P_CN As ADODB.Connection Private Sub Disp_Date()   Dim RS As ADODB.Recordset   Dim SQL AS String    Set RS = Get_Records(SQL)     With RS      If .RecordCount > 0 Then       .MoveLast: .MoveFirst       .Debug.Print !顧客_ID        End If      End With      RS.Close     Set RS = Nothing End Sub Public Function Get_Records(pSQL As String) As ADODB.Recordset   Dim RS As ADODB.Recordset     Set RS = New ADODB.Recordset      RS.Open pSQL, P_CN, adOpenKeyset, adLockOptimistic     Set Get_Records = RS '''    RS.Close '''   Set RS = Nothing End Function

  • ExcelからAccessデータを検索するマクロ

    Excel、Accessとも初心者です。 下記を参考にさせて頂いております。 http://okwave.jp/qa/q441987.html これを、(1)~(3)に対応させたいのですが どのように書き換えればよろしいのでしょうか? (1)A1→ A列の最後まで (2)対応するレコードフィールド2   → 規定した複数のレコードフィールド     (例えば、フィールド3とフィールド5とフィールド8) (3)Excel, Accessともに2007です。 (4)検索の経過は表示させない  (少しでも早く処理したい。ひとつひとつ検索結果を表示すると遅くなると聞ききました) ・・・・・・・・・・・・・・・・・・・・・・・・・ Sub Macro1() Dim db As DAO.Database Dim rs As DAO.Recordset Set db = OpenDatabase("c:\abc.mdb") Set rs = db.OpenRecordset("tbl_a", dbOpenDynaset) rs.FindFirst "[フィールド1]='" & Range("A1").Value & "'" If rs.NoMatch Then   Range("B1").Value = "" Else   Range("B1").Value = rs![フィールド2] End If rs.Close Set rs = Nothing Set db = Nothing End Sub ・・・・・・・・・・・・・・・・・・・・・・・・・ よろしくご教授お願いします。

  • DAO フィルターをかけたい エクセルです

    昨日も http://oshiete.coneco.net/qa8283354.html で質問し、nicotinism様にご回答いただいたのですが またわからなくなったので教えてください。 エクセルからアクセスでDAOで接続した時に、 フィルタをかけて該当のレコードの他のフィールドの値を返すにはどうすればいいでしょうか? ------------------------- Sub test() Dim ac As Object Dim db As DAO.database Dim DAOrs As DAO.Recordset Set ac = CreateObject("Access.Application") Set db = ac.DBEngine.OpenDatabase("PW.accdb", False, True, ";pwd=0000") Set DAOrs = db.OpenRecordset("select * from TPW") DAOrs.Filter = "サイト名 = " & "'nanaco'" MsgBox DAOrs("Password") DAOrs.Close: Set DAOrs = Nothing db.Close: Set db = Nothing ac.Quit: Set ac = Nothing End Sub ------------------------- これだとエラーにもならないけどフィルタがかかってない為、全然関係ないレコードの値を取得してしまいます。 再度ご回答いただければ助かります。 ご教授よろしくお願いします。