[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2004/11/08(Mon) 10:19
投稿者名:西田
Eメール:
URL :
タイトル:
UpdateとUpdateBatchの違い
こんにちは。
私は、VBを始めたばかりの初心者ですが、何卒、よきアドバイスの程、よろしくお願いします。
ついでに、Accessも始めたばかりです。^_^;
(OS:WinXP、VB6.0、Access2000)

VBでアクセスを操作しようと思ってホームページを参考にソフトを作ってる最中ですが、
行き詰ってしまいました。
※一部省略してあります。
dn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\test.mdb"
'
ks.Open "結果", dn, adOpenKeyset, adLockOptimistic
ks.MoveFirst
Do While Not ks.EOF
    If FILE_N = ks![ファイル名] Then
        ks.Fields("確認日") = Date & " " & Time
        ks.UpdateBatch   ←←←←←←←←←←←←← ?????疑問点?????
        Exit Do
    End If
    ks.MoveNext
Loop
ks.Close
dn.Close

VBからAccessファイルをオープンして、FILE_Nとファイル名が同じだった場合、
その行の ”確認日” を空白から更新させたいと思っています。
今までは、”Update” を使用してソフトを作成していたのですが、上手く更新されません。
UpdateBatchにすると上手く更新されるみたいです。
そこで、質問なのですが、UpdateとUpdateBatchの違いは何でしょうか?
どなたか、良きアドバイスがあれば教えて欲しいなぁ〜
お願いします。

投稿時間:2004/11/08(Mon) 11:37
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: UpdateとUpdateBatchの違い
>     If FILE_N = ks![ファイル名] Then
>         ks.Fields("確認日") = Date & " " & Time
ks![ファイル名]
ks.Fields("確認日")
二つの記法が混在していますね。どちらかに統一された方が良いですよ。

なお、処理速度的には、
   ks.Fields("確認日").Value
と書いた方が良いようです。Valueプロパティを書くのが面倒なら、
   ks.Collect("確認日")
とも書けます。

>         ks.Fields("確認日") = Date & " " & Time
Date関数、Time関数は、ともに 日付型の値を返します。
文字列型の値ではありませんので、&演算子での連結は推奨されません。
(この記法では、コントロールパネルの設定によって、結果が異なってしまいます)

日付型を文字列型に変換したい場合は、たとえば、
  〜 = Format(Now(), "yyyy\/mm\/dd hh\:nn\:ss")
などのように、Format関数を併用するようにしてください。


> 今までは、”Update” を使用してソフトを作成していたのですが、上手く更新されません。
mdbファイルを更新する際は、Connectionオブジェクトの BeginTrans/CommitTransメソッドを使って
トランザクションを明示的に利用するようにしてください。

BeginTrans/CommitTransが使われなかった場合、mdbへのデータの反映が、
最長で 0.5秒間ほど遅延する可能性があります。(レジストリ設定によりますけど)


> UpdateBatchにすると上手く更新されるみたいです。
編集/追加後、Updateを呼び出さずに、UpdateBatchを呼び出した場合、内部で自動的に
Updateメソッドが呼び出され、その後、UpdateBatchが呼ばれる事になります。
(と、ヘルプに書いてありますよ)


> そこで、質問なのですが、UpdateとUpdateBatchの違いは何でしょうか?
複数行に対する更新を、一度に「バッチ更新」するために使うための物です。
Updateが「Recordset内のデータの更新」を行うのに対して、UpdateBatchは、
「Recordsetの内容を、実際のデータベースに反映させる」ために使われます。

バッチ更新モードでは、UpdateBatch メソッドを呼び出すまで、1行または複数行の
レコードに対する変更を、ローカルにキャッシュしておく事ができます。そして、
UpdateBatchを呼ぶ事で、キャッシュされた情報を反映させる事ができます。


なお、バッチ更新モードは、adLockOptimisticモードではなく、
adLockBatchOptimisticモードにて使います。また、カーソルタイプが、
adOpenKeyset または adOpenStatic の時にのみ使用可能となります。


なお、UpdateとUpdateの違いは、「adUseClient」モードで使った際に謙虚になります。
バッチ更新を使う事で、adUseClientではオフラインでの更新が可能となっています。
たとえば、データを取得後、データベースとの接続を切り離しておき、
Recordsetに対して削除/追加更新処理を加えてから、最後に
データベースと再接続して UpdateBatch を行うような事ができます。


ただし Jet では、バッチ更新が完全にはサポートされていないため、
2行以上のデータを一度に UpdateBatch しようとすると失敗します。

投稿時間:2004/11/08(Mon) 11:56
投稿者名:西田
Eメール:
URL :
タイトル:
お礼
魔法の仮面弁士さん、回答ありがとうございました。
とてもためになりました。
仮面弁士さんの言われたように、プログラムを修正して対応していきたいと思います。
私も、もっともっと努力して頑張ろうと思いますが、今後とも、良きアドバイスの程お願いします。
本当に、ありがとうございました。(●^o^●)