はじめての親子ハイキングに挑戦!! >>

アクションクエリを実行する際、表題の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と関連する良く見られている質問

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

QDAOとADOの違いについて

Accessからイントラネット上のデータベースに接続するための接続方法で困っています。
DAOとADOの違いが分からず困っています。
メリット、デメリットが分かる方、どうか教えてください。

宜しくお願い致します。

Aベストアンサー

DAO(データアクセスオブジェクト)はAccessで使用されるMicrosoftJetデータベースエンジン を公開した最初のオブジェクト指向インターフェイスです。DAOは単一システムのアプリケーションや小規模でローカルなネットワークで使用するのに最も適しています。
とMSDNライブラリでは説明しています。
DAOはJetデータベースエンジンを対象にして開発されているのでJetのもつセキュリティ機能・データ定義機能などを十分に操作することができます。
ADO(ActiveXDataObjects)ではオブジェクトの種類が簡素化されているためJetデータベースエンジンの細かな機能を制御することができないといった点が不足している部分がありますがADOXやJROの各オブジェクトモデルで使用できる機能を使えばADOで不足している機能をほとんど補うことができます。
DAOはデータベースにAccessを使用するアプリケーションの場合、最大のパフォーマンスを得ることができます。しかしアプリケーションを運用していくうちに規模が大きくなってデータベースをSQLServerに移行することがあるかもしれません。
そのような可能性が含まれているのであれば最初からADOで開発しておいたほうが無難です。ADOはSQLServerに対する処理で良いパフォーマンスを得ることができます。

Jetデータベースエンジンを主なターゲットにしているならDAOで可。それ以外のデータベースを利用するのであればADOを選択する方が良いのではと思います。

DAO(データアクセスオブジェクト)はAccessで使用されるMicrosoftJetデータベースエンジン を公開した最初のオブジェクト指向インターフェイスです。DAOは単一システムのアプリケーションや小規模でローカルなネットワークで使用するのに最も適しています。
とMSDNライブラリでは説明しています。
DAOはJetデータベースエンジンを対象にして開発されているのでJetのもつセキュリティ機能・データ定義機能などを十分に操作することができます。
ADO(ActiveXDataObjects)ではオブジェクトの種類が簡素化されて...続きを読む

QAccess サブフォームでの選択行の取得

こんにちは。

Access初心者です。

サブフォームでテーブルの項目を表示させていますが、
選択された行を取得する方法はありますか?
サボフォームの下の方に現在選択されているレコード数が表示されてますが、その値でかまいません。

調べているのですが、なかなか検討がつきません。
宜しくお願い致します。

Aベストアンサー

フォーム名がフォーム1、サブフォームコントロールの名前がサブフォーム1だとすると、

Forms!フォーム1!サブフォーム1.Form.CurrentRecord

で取得できます。
(「Forms」と「Form」がありますのでご注意下さい)


また、フォーム1にコードを記述する場合であれば

Me!サブフォーム1.Form.CurrentRecord

サブフォーム1へのコード記述であれば

Me.CurrentRecord

という構文によっても、それぞれ取得が可能です。

QAccessの画面更新を一時的に停止する方法。

こんにちは。
Accessの画面更新を一時的に停止する方法を捜しています。
ExcelのScreenUpdatingと同様な機能です。

VBAでの更新処理時に画面がチラチラと動くのを防止したいと思っています。
(Ver:Access2000)
ご存知の方宜しくお願い致します。

Aベストアンサー

Application.Echo False '画面の描画を止める

・・・処理を実行する・・・

Application.Echo True '画面の描画を行う

Qアクセエスのレコードの更新をVBAでするには?

アクセスで、一覧表のフォームにボタンを取りつけています。レコードの内容を変更したら、ペンの形のマークが現れますね。これは変更中ということですが、そこでボタンを押しても変更は確定されないから、更新確定させたいのです。

それで、DoCmd.Requery を最初の行に入れてみたら、元の一覧表は最初のレコードに飛んでしまう。

元の一覧表の位置を動かさないために、Ctrl+Enter キーを押して更新確定させたような状態をVBAで実現する方法あるのでしょうか?

よろしくお願いします。

Aベストアンサー

No1 です。
今回の場合には
Docmd.RunCommand acCmdSaveRecord の方が良かったですね
文字通りレコードを保存します。
Requery に引きづられてしまいました (^_^;)

Recalc、Refresh、Requery の使い分けは下記が参考にはなりますか?
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

Q【ACCESS】フォーム名/コントロール名を文字列型変数で指定するには

バージョン:Access2002

フォーム「frm01」にテキストボックス「tb01」が作ってある場合、
Forms.frm01.tb01.Value="あいう"
とすれば、フォームもコントロールも指定できるのですが、
Dim strTxt As String
strTxt = "tb01"
Forms.frm01.strTxt.Value="あいう"
だと、文字列型変数"strTxt"が展開されないのでフォーム「frm01」のコントロール「strTxt」を探してしまいエラーになってしまいます。

文字列型変数でフォームやコントロールを指定するには、どのようにすればよいのでしょうか?

Aベストアンサー

フォームの場合
 Forms(strFrm)

フォームのコントロールの場合
 Forms(strFrm).Controls(strTxt)


これでも参照できますが、普通ここまで省略しませんね。
 Forms(strFrm)(strTxt)

あとで見たとき、訳がわからなくなりそう。

Qカレントレコードが無い事を判定させる方法

SQLを使ってmdb内のレコードセットを取得し、
無かったらエラーを返す、という処理を作成
する場合、カレントレコードが無い事を
判定するにはどうすれば良いでしょうか?
イメージは下記のような感じです。

レコードセット as DAO.Recordset

'レコードセット取得
 Set レコードセット = db.OpenRecordset(作成したSQL文)

'判定
If カレントレコード無 Then
MsgBox "エラーメッセージ"
Exit Sub
End If

Aベストアンサー

カレントレコード無は"レコードセット.RecordCount = 0"
で行けませんか?

Q「RunSQL」と「Execute」の違い

アクセスvbaについて
更新クエリを実行するとき
DoCmd.RunSQL strSQL
cn.Execute strSQL
の違いは、
アクションクエリの確認のメッセージボックスを表示するかしないかの違いだけですか?
(Executeは確認画面が表示されない)

Aベストアンサー

私自身は、「マクロをVBAに変換」でVBAに移ってきたこともあって、
DoCmd.RunSQLばかり使っていますが・・・(汗)

こちらのサイトが簡潔でわかりやすいかと思いますが、
http://www.mahoroba.ne.jp/~mw_ken/transrunsql.html
Executeを使用した場合はRollbackを使用することで元に戻せる
一方で、RunSQLの場合は、「DoCmd.SetWarnings False」を
予め指定した場合、戻すことができなくなります。
(「True」にした場合も、『更新対象レコード数が表示されたときの
 メッセージで「いいえ」を選択した場合だけ』と非常に限定的)
※「Rollback」については、VBEのヘルプで検索してみて下さい。


その意味では、
 実行中に、(想定済みの)エラーが発生したらRollbackを行う
  →Executeが必須
 SQL実行後のコードでエラーしても元に戻す必要がない
 (または(私のように)そこまでの制御はできないので諦める(汗))
  →ExecuteでもRunSQLでも可
といったことになるかと思います。
(Executeの方ではメッセージボックスが表示されないのは、Rollbackという
 取り消し手段を持っているから、ということかと)


なお、「同期・非同期」の話が過去の質問で出ていますが、
そこでのNo.2の実験では、差が見られなかったとのことです。
(この辺り、不勉強なためわかりませんが・・・(汗))
http://oshiete1.goo.ne.jp/qa2680886.html

私自身は、「マクロをVBAに変換」でVBAに移ってきたこともあって、
DoCmd.RunSQLばかり使っていますが・・・(汗)

こちらのサイトが簡潔でわかりやすいかと思いますが、
http://www.mahoroba.ne.jp/~mw_ken/transrunsql.html
Executeを使用した場合はRollbackを使用することで元に戻せる
一方で、RunSQLの場合は、「DoCmd.SetWarnings False」を
予め指定した場合、戻すことができなくなります。
(「True」にした場合も、『更新対象レコード数が表示されたときの
 メッセージで「いいえ」を選択した場合...続きを読む

QAccessのテーブルデータを一気にVBAで追加したい・・

Accessのテーブルデータを一気にVBAで追加したい・・

Accessに一時商品登録データというテーブルがあり、
問題なければ商品登録データにデータを流し込みたいと思っています

テーブルのデータ構造は全く同じです

VBAで一時商品登録のテーブルから一件ずつデータを読み取って
商品登録データに追加することは出来るのですが
一気にデータを追加する方法があれば教えていただけないでしょうか?

よろしくお願いいたいます

Aベストアンサー

本当にいろいろな方法があります。

一番簡単なのは、
あらかじめ「追加クエリ」を作成しておき

 Docmd.OpenQuery "追加クエリ名"

あるいは DAO で

 Set dbs = CurrentDB
 dbs.Excute "追加クエリ名"

追加クエリを使用しない場合は
追加クエリの SQL文 に相当するSQL を 実行。

 strSQL="INSERT INTO 商品登録データ SELECT 一時商品登録データ.* FROM 一時商品登録データ"

 Docmd.RunSQL strSQL

あるいは DAO で

 Set dbs = CurrentDB
 dbs.Excute strSQL

とか。

直書き、間違いがあったら御免。

QACCESSで空白のデーターをクエリで判定/識別する方法を教えてくださ

ACCESSで空白のデーターをクエリで判定/識別する方法を教えてください。
EXCELでは空白を""で判定/識別表していますがACCESSではどうなるのでしょうか。

下の例はフィールドに試験番号があればその番号を、空白なら”欠席”と表示しようとしています。
IIf(([試験番号]="空白の場合何を入れる?"),[試験番号],"欠席")

Aベストアンサー

もうひとつの書き方は
式1: IIf([試験番号] Is Not Null,[試験番号],"欠席")
第2、第3引数の、質問の順序にあわせるとこうなる。


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

人気Q&Aランキング