• ベストアンサー

Access200 ADO adLockPessimisticとadLockOptimisticの違い

ADOのレコードセットを編集可能でオープンするときの引数に adLockOptimisticとadLockPessimisticがありますが、 違いは何なんでしょうか? 初心者向けの解説書しか見ていないので詳しく書いていません。 どちらでオープンしても編集できるので結果オーライなんですが、 知っておくと、今後の開発に参考になるかもしれません。 よろしくお願いいたします。

  • tiga-
  • お礼率77% (170/219)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

adLockOptimistic:共有的ロック adLockPessimistic:排他的ロック と呼ばれるもので、共有的ロックでオープンしてレコードを編集している場合 他のユーザーは(更新はできないけれど)そのレコードにアクセスする事が可能ですが 排他的ロックでオープンして編集している場合 他のユーザーはそのレコードに一切アクセスできなくなります。

参考URL:
http://www.itmedia.co.jp/help/howto/win/win2000/0007special/complus_vb/chap1/05.html
tiga-
質問者

お礼

ありがとうございます。 うすうすそんなことかなとは思っていたんですが、 私の持っている解説本には どちらかで開くとしか書いておらず、 違いがわかりませんでした。 その他にも、引数でよくわからないのがありますが、 (わかるのはReadOnlyだけかな。) まあ、思ったとおり動いているので 今のところOKなんですが、トラブル等があった場合、 知っておくと、対処できるかもしれません。 本当にありがとうございます。

関連するQ&A

  • ADOのRecordSet.Openの引数について(2)

    ADOを勉強中です。RecodeSetオブジェクトのOpenメソッドの引数について、本に以下のような内容があったのですが、意味が分かるようで、良く分かりません。 カーソルタイプの定数 (1)adLockPessimistic…レコードごとの排他的ロック。編集が競合した場合、データソースでレコードをロックすることで、確実にレコードを編集できるように、必要な最小限のロックをする。 (2)adLockOptimistic…レコードごとの共有的ロック。Updateメソッドを呼び出した場合のみレコードがロックされ、ほかのユーザはアクセスできなくなる。 (3)adLockBatchOptimistic…共有的バッチ更新処理を行う。即時更新モードに対して、バッチ更新モードの場合に必要。 それぞれどういうことを意味しており、どういうときにどれを選択したらよいのでしょうか。 よろしくお願いします。

  • ADOで排他ロックがうまくいかない

    VB6.0+access98で開発してます。 ADOを使ったレコード単位の排他ロックについて教えてください。 rs.Open時に,adLockPessimisticを指定しても,ロックされません。 rs.Update のところで一瞬ロックされているようです。 あるレコードの編集中は登録またはキャンセルされるまで、 ずっとロックしていたいのです。 他端末からそのレコードにアクセスした際にエラーが返るように したいのです。 上手く出来る方法ありませんか?

  • adoでBetween は使えないのでしょうか?

    ADOで期間で抽出したいのですが rs.Open strテーブル, cn, adOpenStatic, adLockPessimistic rs.Filter = "計上日 = #2015/01/01#" は問題なく通るのですが、 rs.Open strテーブル, cn, adOpenStatic, adLockPessimistic rs.Filter = "計上日 Between #2015/01/01# And #2015/01/31#" だと 実行時エラー3001「引数が間違った型、許容範囲外、または競合しています。」 と言うエラーになります。 adoでBetween は使えないのでしょうか?

  • Access ADO RecordSetについて質問です。

    Access ADO RecordSetについて質問です。 Openイベントでフォームにレコードセットを挿入しています。 その際のフォームにはレコードセットをコントロールソースとしてテキストボックスが10個ほどあります。 しかし、テキストボックスを修正しようとしても、入力が出来ません。 レコードセットの作り方が悪いのか、フォームがおかしいのかわかりません。 流れとしては、帳票フォームより、単票フォームを呼び出し、IDでSQLを発行し、レコードセットを挿入しています。 その単票フォームは修正フォームとして更新したいのですが、入力が出来ず困っています。 詳しい方や同じ事で悩んだ方のアドバイスよろしくお願いいたします。 Private Sub Form_Open(Cancel As Integer) Call SetRecordSet("SELECT * FROM T_Agent WHERE ID =" & Me.OpenArgs, Me) End Sub Public BackEndCn As ADODB.Connection Public BackEndRs As ADODB.Recordset Public Sub SetRecordSet(strSQL As String, FormName As Form) Set BackEndCn = New ADODB.Connection Set BackEndRs = New ADODB.Recordset BackEndCn.ConnectionString = DbPass BackEndCn.Open BackEndRs.Open strSQL, BackEndCn, adOpenKeyset, adLockOptimistic Set FormName.Recordset = BackEndRs BackEndRs.Close: Set BackEndRs = Nothing BackEndCn.Close: Set BackEndCn = Nothing End Sub

  • アクセス ADO レコードの件数がおかしい

    アクセスADOでクエリの行数を取得したいのですが クエリが200行でも100行でも必ず12が返ります。 クエリ1は、一度12行の時にadoで数を取得し、その時は、正しく12が返ったのですが、 行数が変わっても12が返ります。 コードは、 Sub Sample() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "SELECT * FROM クエリ1", cn, adOpenStatic, adLockPessimistic Debug.Print rs.RecordCount rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub です。 Debug.Print DCount("*", "クエリ1") だと、正しいレコード数が取得されるのですが、ADOだとおかしいです。 クエリ1のSQL文は、 SELECT Q_作業用.* FROM Q_作業用; のように、別のクエリを持ってきています。 何が原因なのでしょうか? よろしくお願いします。

  • ADOでエクセルからアクセスにデータを追加したいのですが、「CursorType」と「LockType」がどれが適切かわかりません。

    ADOでエクセルからアクセスにデータを追加したいだけなのですが 「CursorType」と「LockType」がどれが適切かわかりません。 CursorType 0 adOpenForwardOnly   レコードの前方スクロールだけが可能な静的カーソル。 (デフォルト) 1 adOpenKeyset 他のユーザによる変更データを参照可能。但し、追加データは参照できず、削除データにはアクセスできない。 2 adOpenDynamic 他のユーザーによる追加、変更、削除の操作が即座に反映される。 3 adOpenStatic レコード集合のコピーによる静的カーソル。前方、後方への移動が可能。 LockType 1 adLockReadOnly 読み取り専用。 2 adLockPessimistic レコード単位での排他的ロック。編集操作開始時にレコードをロックする。 3 adLockOptimistic レコード単位での共有的ロック。Updateメソッドを呼び出し時にレコードをロックする。 4 adLockBatchOptimistic 共有的バッチ更新。即時更新モードに対するバッチ更新モード。 ・エクセルもアクセスも使用しているのは自分ひとりです。 ・LockTypeについては Updateメソッドを使用してアクセスにデータを追加するため「adLockOptimistic」が適切かなと思うのですが CursorTypeの静的・動的がわからず判断できません。 ご教授よろしくお願いします。

  • oracleとexcelのADOによる連携について

    お世話になります。 excelからADOでoracleのデータベースにある テーブルの必要なデータのみを抽出してexcelに 書き出そうとしています。 excelのvbaコードで、まず、ADOコネクションの生成として、 「cn.Open "Provider=OraOLEDB.Oracle;Data Source=" & "DB名" & ";User ID=hpsuser;Password=○○○;", "○○○", "○○○"」と書き、 ADOレコードセットの生成で、 「 rs.Open "~(1)~", cn, adOpenDynamic, adLockOptimistic, adCmdText」 と書いていますが、上記「~(1)~」の部分がかなり長いクエリ文になっているからなのか、 エラーがかかってしまいます。 単純なテーブルのデータを呼び出す事しかできないのか、又、 長いクエリ文のデータを抽出したい場合どの様にしたら良いのか、 どなたかご親切な方、ご教示頂けます様、宜しくお願いいたします。

  • アクセスでADO 並べ替えが適用できない

    アクセスでADOを使っているのですが、 Sub test() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.CursorLocation = adUseClient rs.Open "SELECT * FROM Q1", cn, adOpenStatic, adLockPessimistic rs.Sort = "受付日 DESC" For i = 1 To rs.RecordCount ・ ・ ・ このようなコードを作っていますが、 rs.Sortの部分で、「並べ替えを適用できません」になります。 レコード数は、15000件くらいです。 なぜ並べ替えができないのでしょうか? しょうがないからクエリで最初から並べ替えしておきますが、原因を教えてください。

  • VBAでOracleにSQL発行(ADO)

    ExcelのVBAからOracleにADOで登録したく下記のコードを作成しましたが コンパイルで"変数定義がされていません”に成ってしまいます。 参照設定に何か必要なのでしょうか? ----------------------------------------------- 'ADO用のオブジェクト変数の宣言 Dim cn As New ADODB.Connection ← ここでエラー Dim rs As New ADODB.Recordset Dim rownum As Long Dim colnum As Integer 'ADOコネクションの生成 cn.Open "Provider=OraOLEDB.Oracle;Data Source=" & ActiveSheet.Cells(26, 1) & ";User ID=scott;Password=tiger;", "scott", "tiger" 'ADOレコードセットの生成(全データを返すレコードセットの生成) rs.Open "select * from emp", cn, adOpenDynamic, adLockOptimistic, adCmdText ... ... ...

  • ADO カレントレコードを取得したい

    フォーム1にテーブル1をドラッグしました。 そして図の状態で 現在カーソルがあるレコードの値をadoで取得することは可能ですか? 図ではカレントレコードは2レコード目なのに CN.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & CurrentProject.FullName RS.Open "テーブル1", CN, adOpenStatic, adLockPessimistic MsgBox RS("書名") とすると1レコード目の値が表示されます。 本当は2レコード目の 「「なりたい自分」になれる中、、、」 を取得したいです。 どうすれば▲(横)ボタンのあるレコードをカレントレコードとして、 そのレコードの値を取得することが可能でしょうか? ご教授よろしくお願い致します。

専門家に質問してみよう