餃子を食べるとき、何をつけますか?

アクションクエリを実行する際、表題の2つを検討しています。
最重要な違いに同期と非同期であることをネットで検索して分かりました。
非同期だとどのような問題が発生するのか具体的に教えて頂けると助かります><

A 回答 (3件)

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
    • good
    • 0

> > 非同期であれば実行したクエリの内容が完結しないうちに次の SQL を実行しようとする


> 結果どのような問題が発生するのでしょうか?

実行した SQL が実際に DB エンジン側で処理完了する前に、プログラムの次のステップがすぐに実行されるとか。
    • good
    • 0

Access 程度なら特に考慮しなくてもいいんじゃないでしょうかね。


非同期であれば実行したクエリの内容が完結しないうちに次の SQL を実行しようとするので、アクション クエリの実行に時間が掛かるのであれば同期タイプで行ったほうがいいかもしれないですけど。

というかいまどき DAO じゃなくて ADO でやれば?
どっちでも構わないけど。。。

この回答への補足

> 非同期であれば実行したクエリの内容が完結しないうちに次の SQL を実行しようとする
結果どのような問題が発生するのでしょうか?
お手数ですがご回答頂ければ幸いです。

補足日時:2007/01/21 23:58
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


おすすめ情報

このQ&Aを見た人がよく見るQ&A