- 締切済み
[性能改善]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 ---------------------------------------------------------------------- よろしくお願いします。
- sakura791
- お礼率100% (1/1)
- その他(データベース)
- 回答数1
- ありがとう数1
- みんなの回答 (1)
- 専門家の回答
みんなの回答
どのような更新がやりたいのか良く判りませんが、10万回もSQLを繰り返せば当然遅いはずです。一つのSQLで不可能であれば、数個の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
- ベストアンサー
- Visual Basic
- 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 ※無効な処理です。というエラーが出ます。
- ベストアンサー
- Visual Basic
- 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
- ベストアンサー
- Visual Basic
- 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がかえるのですが なぜレコードの行数を取得できないのでしょうか?
- ベストアンサー
- その他MS Office製品
- アクセス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 ------------------------- これだとエラーにもならないけどフィルタがかかってない為、全然関係ないレコードの値を取得してしまいます。 再度ご回答いただければ助かります。 ご教授よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
お礼
SQLの方を変更することになりました。 回答ありがとうざいました。