3

DAO 3.6 には、行レベルのロックがサポートされていないという問題がありました。詳細については、このナレッジ ベースの記事を参照してください。

アクセスチームのブログから学びました:

Office Access 2007 では、Access データベース エンジンの新機能をサポートするために、新しいオブジェクト、プロパティ、およびメソッドが DAO に追加されます。

Access2007 Visual Basic Editor のオブジェクト ブラウザでこのライブラリを見ると、新しい化身は ACEDAO と呼ばれます。MSDN のホットフィックスで acedao.dll に関する言及を見つけることができますが、他には何もありません。

ACEDAO のエンド ユーザー ドキュメントがどこにあるか知っている人はいますか?

ACEDAO が行レベルのロックをサポートしているかどうかを確認するにはどうすればよいですか?

4

2 に答える 2

7

そのナレッジベースの記事に変更はなかったと思います。ただし、レコードロックがどのように実装されたかを覚えておく必要があります。

ネットワーク上の任意のユーザーによるテーブルが開かれ、それらのユーザーが行ロックを有効にしている場合、DAO / ADO/ACEがコードでそのテーブルをどのように開くかは重要ではないことに注意してください。

行ロックを使用している既存のユーザーは、使用しているそのレコードに対して行ロックを強制します。また、そのレコードセットコードが適切な時間レコードを開いたまま/ロックしたままにすることは非常にまれであるため、ページロックまたは行ロックがここで違いを生むことはめったにありません。したがって、ほとんどの場合、ユーザーがフォームのデータを編集している場合は、ロックが必要です。コードの場合、それはまれな問題になる傾向があります。

したがって、tools-> optionsのユーザー設定は、実際にユーザーのこの選択を決定します。ここで明確にし、髪の毛を分割しないようにするために、UIの行ロック設定は、デフォルトで問題を強制するのと同じくらい、実際には選択をオーバーライドしません。

この機能をオンにしたときの行ロックの仕組みを覚えておいてください。ジェットエンジンはレコードのサイズを1ページのサイズに拡大するだけなので、以前と同じように昔ながらのページロックを使用します。これは私が問題を強制することによって意味するものです。ユーザーが行ロックをオンにした場合、豆の山が変わることはありません。次に、行ロックでreocrdssetを開かなかったレコードセットを使用して、ユーザーによってロックされたレコードを取得しようとします(ページロックとは対照的) )。これは再びページ解像度に帰着するため、レコードをロックして編集することは許可されていません。

真の行ロックのようなものはありません。ただし、レコードのサイズを常に1ページに拡張すると、ラウンドアバウトで同じ目標を達成できます。

上記の情報を考えると、これは2つのことを意味します。

まず、ユーザーがすでにフォームでレコードをロックしている場合に、reocdsetをページまたは行として開いても、違いはありません。データを編集するユーザーは、ページのどれだけが使い果たされるかを決定します(そして、行ロックがオンになっている場合、それはデータの完全なページです)。

第2号。編集された各レコードが1つのデータベースページを占有することを余儀なくされるため、ファイルが非常に急速に肥大化するため、このオプションの使用について長く真剣に考える必要があります。何千ものレコードを更新するコードを実行している場合は、これを実行したくない可能性があります。ただし、ユーザーは1日にそれほど多くのレコードを編集することはできず、毎日の圧縮ルーチンを使用すれば、問題になることはありません。

論理的には、これは、このオプションが実際に役立つのは、ユーザーが互いにつまずいたときにデータを編集する場合のみであることを意味します。ただし、レコードセットコードの場合、行ロックを使用することが役立つことはめったになく、適切でさえありません。

結局のところ、この機能は、同じフォームで同じデータにアクセスしようとしているユーザーが複数いる場合にのみ適切です。したがって、これはコード+reocordsetsを使用する機能というよりもユーザーインターフェイス機能です。

ACE + daoが行ロックを使用してreocrdsetを開くことができることに気付くかもしれませんが、なぜ心配するのでしょうか。あなたはダオを使わない、そしてあなたはとにかくそれが好きではない。そして、とにかくユーザーシナリオを変更することはありそうにありません。

- 編集:

このレコードページのロックを説明する便利なリンクがありません。私はこれをどこかで読んだことを知っていますが、リンクがありません。

私はここ数日本当に忙しかったです(私はaccess 2010ベータ版の一部であり、月曜日にはサインアップした一般の人々にリリースされたCTPもあります)。だから、私は最近本当に忙しかったです。

ただし、これを表示するコードを試すことができます。次のコードは、行ロックがオンになっていないmdbで約1メガの膨張を引き起こします。(約5.8メガから約6.5メガになります)。

Dim rst        As DAO.Recordset
Dim i          As Long
Dim t          As Single

Set rst = CurrentDb.OpenRecordset("contacts")

t = Timer
Me.Text1 = "working..."
DoEvents
Do While rst.EOF = False
   rst.Edit
   i = i + 1
   rst!City = "ci " & i
   rst.Update

   rst.MoveNext

   If i Mod 500 = 0 Then
      Me.Text1 = i
      DoEvents
   End If


Loop

t = Timer - t
Me.Text1 = "done in " & t & " seconds"
Beep

レコードロックをオンにして同じコードを実行すると、ファイルのサイズはなんと123メガバイトになります。上記のコードが含まれているサンプルmdbへのリンクは次のとおりです

http://www.kallal.ca/test/bloat.zip

したがって、上記をダウンロードしてください。ツール->オプション->詳細->行レベルのロックで開くで実行します。

次に、テーブルを空にします。コンパクトで修理します。上記の設定を変更して再度実行します(必ず終了し、その設定を変更した後、データベースに再度アクセスしてください)。

行をロックせずに上記を実行すると、ファイルは約1メガ増加します。行ロックをオンにして実行すると、110メガをはるかに超えるデータファイルの増加が得られます。それは確かに非常に大きな違いです。

于 2009-07-13T19:09:03.730 に答える
0

ACEDAO は、MS のドキュメントに関係なく、デフォルトでレコードレベルのロックを使用する可能性が最も高く、DAO はデフォルトで使用されます。これは、同じ DAO コードを使用して、基礎となる Access 97 DB から Access 2000 または ACCDB に切り替えた後に発生する肥大化 (上記) によって証明できます。

詳細については、こちらの私の回答を参照してください。

Access 2007 では ADO と DAO のどちらを使用するのがよいでしょうか?

正しい情報を含む MSDN リンクを反映するように編集:

「レコード レベルのロックは、ADO および DAO レコードセット オブジェクトの既定値です。ページ レベルのロックは、ADO Command オブジェクトまたは DAO QueryDef オブジェクトを使用する SQL DML ステートメント (UPDATE、DELETE、INSERT INTO ステートメントなどの一括操作) の既定値です。 "

http://msdn.microsoft.com/en-us/library/aa165435(office.10).aspx

于 2011-01-17T18:47:13.410 に答える