質問: accessのdao.executeとdocmd.runsqlの違いについて アクションクエリを実行する際、表題の2つを検討しています。 最重要な違いに同期と非同期であることをネットで検索して分かりました。 非同期だとどのような問題が発生するのか具体的に教えて頂けると助かります><
回答: docmd.runsql ですが、「非同期」であると幾つかのhpで見かけましたが、実際試してみると「同期」実行している感じです(access2000で実験)。 実際「非同期」なんでしょうか? オフィシャルなサイトに「非同期である」と言う記述はありますか? ------------検証プログラム------------ sub local_test() dim sql(4) as string dim t as double sql(1) = "update t1 set data = '0';" sql(2) = "update t1 set data = '1';" sql(3) = "update t2 set data = '0';" sql(4) = "update t2 set data = '1';" '初期化 currentdb.execute sql(1) currentdb.execute sql(3) 'docmd.runsql テスト-------------------------------------------- docmd.setwarnings false t = timer() docmd.runsql sql(2) debug.print "docmd.runsql " & format(timer() - t, "0.00000") docmd.setwarnings true 'dao.execute テスト-------------------------------------------- t = timer() currentdb.execute sql(4) debug.print "currentdb.execute " & format(timer() - t, "0.00000") end sub --------------------------------------------------------- t1 t2 とも、3万件程度のテストデータが入っています。 docmd.runsql の方も処理が終わるまで返ってきません(同期実行では?) docmd.runsql は setwarnings を設定しないと、確認メッセージが出でます。 docmd.runsql が同期実行だとすると、これ以外に大きな違いは無いのかも知れませんね。 ########################################################## 今度はadoを使って無理やり非同期実験 別のmdbにファイルにadoでアクセスしています。 ------------検証プログラム------------ sub ado_test() dim cnn(2) as new adodb.connection dim sql(6) as string dim dbname as string dim t as double dbname = "c:\temp\db1.mdb" sql(1) = "update t1 set data = '0';" sql(2) = "update t1 set data = '1';" sql(3) = "update t1 set data = '2' where data = '1';" sql(4) = "update t2 set data = '0';" sql(5) = "update t2 set data = '1';" sql(6) = "update t2 set data = '2' where data = '1';" cnn(1).open "provider=microsoft.jet.oledb.4.0; data source=" & dbname & ";" cnn(2).open "provider=microsoft.jet.oledb.4.0; data source=" & dbname & ";" '初期化 cnn(1).execute sql(1) cnn(1).execute sql(4) '同期実行テスト-------------------------------------------- t = timer() cnn(1).execute sql(2) cnn(1).execute sql(3) debug.print "同期実行 " & format(timer() - t, "0.00000") '非同期実行テスト-------------------------------------------- t = timer() cnn(1).execute sql(5), , adasyncexecute cnn(2).execute sql(6), , adasyncexecute debug.print "非同期実行 " & format(timer() - t, "0.00000") end sub --------------------------------------------------------- 非同期の方が明らかに速いです。(処理を待たずに返ってくるので) 非同期の方は正しく更新できてません。 この検証プログラムが正しいのか?、あまり自信はありません(^^; 参考程度にして下さい。 ########################################################## 補足 daoかadoか? http://www.naboki.net/access/heaven/heaven_14.html http://homepage2.nifty.com/inform/vbdb/daoado.htm