クラスでプロパティとして設定したレコードセットにレコードを追加するには?

解決


茶馬  2003-02-18 06:26:19  No: 77128

クラスで設定したプロパティ(レコードセット)にレコードを追加したいのですが、ご教授願います。

このプロパティにはDBよりレコードセットを抜いてきて格納しています。
このプロパティに書き込むことによって直接DBに反映させるのではなく、
変数のようなイメージでワークとして使いたいのですがADDNEWを使ったところ
エラーが発生してしまいます。(Deleteは通るのですが・・・)

エラー内容としては
現在のレコードセットは更新をサポートしていません。
プロバイダか、選択されたロックタイプの限界の可能性があります
というメッセージが出ます。

どなたか解決方法をご存知の方がいたらお教えください、お願いします。


魔界の仮面弁士  2003-02-18 11:20:55  No: 77129

> 変数のようなイメージでワークとして使いたいのですが
DAO.Recordsetの場合は、DBと切り離すことができません。
この場合は、一時的なワークテーブルを用意してください。

ADODB.Recordsetの場合は、DBと切り離したレコードセットを生成できます。
CursorLocationとしてadUseClientを指定し、LockTypeにadLockBatchOptimisticを
指定してやればOKです。

あるいは、
    Set Stm = New ADODB.Stream
    Stm.Open
    RS1.Save Stm

    Set RS2 = New ADODB.Recordset
    RS2.CursorLocation = adUseClient
    RS2.LockType = adLockBatchOptimistic
    RS2.Open Stm
    
    Set Stm = Nothing
のように書けば、現在のレコードセット(RS1)を元に、その静的コピーを
別の編集可能なレコードセット(RS2)として構築できます。

> 現在のレコードセットは更新をサポートしていません。
> プロバイダか、選択されたロックタイプの限界の可能性があります
エラーメッセージから察するに、ADOでの接続ですよね。
どのようなコードを書いているのか、見せていただけませんか?

> どなたか解決方法をご存知の方がいたらお教えください、お願いします。
まずは「読み取り専用カーソルになっていないか」を確認してみてください。
もし、DBに接続されているRecordsetに対して更新しているのであれば、
主キーが抽出結果に含まれているかどうかも確認してみてください。


茶馬  2003-02-18 18:17:25  No: 77130

魔界の仮面弁士さん書き込みありがとうございます。

>エラーメッセージから察するに、ADOでの接続ですよね。
はい、ADODB.Recordsetを使用しています。

>まずは「読み取り専用カーソルになっていないか」を確認してみてください。
>主キーが抽出結果に含まれているかどうかも確認してみてください。

>どのようなコードを書いているのか、見せていただけませんか?
私は駆け出しプログラマなので、見当違いなソースかもしれませんが、
こんな感じでコーディングしています。

  '*********************DBとの接続(クラス)***************
    Set mCn = New ADODB.Connection
    mCn.Open ("TestDB")
    Set mRs1 = New ADODB.Recordset
    mRs1.Open "SELECT文", mCn, adOpenStatic

    Set mrec1= mRs1

 '***********************プロパティ宣言部***********************
  Public Property Get Rec1() As ADODB.Recordset
    Set Rec1 = mrec1
  End Property

  Public Property Set Rec1(value As ADODB.Recordset)
    Set mrec1 = value
  End Property

 '**********************追加部(フォーム)*****************
  With CLASS.Rec1
    .AddNew
    .Fields.Item(0) = 2
    .Fields.Item(4) = Long
    .Fields.Item(5) = strTxt
    .Update
  End With


茶馬  2003-02-18 18:21:49  No: 77131

記入ミスがありましたすみません。
>まずは「読み取り専用カーソルになっていないか」を確認してみてください。
>主キーが抽出結果に含まれているかどうかも確認してみてください。

読取専用、主キーともに設定していません。


takk  2003-02-18 19:16:11  No: 77132

>  '*********************DBとの接続(クラス)***************
>    Set mCn = New ADODB.Connection
>    mCn.Open ("TestDB")
>    Set mRs1 = New ADODB.Recordset
>    mRs1.Open "SELECT文", mCn, adOpenStatic
>
>    Set mrec1= mRs1

ここでレコードセットのオープン時にロックタイプを指定していません。
ロックタイプのデフォルト値はadLockReadOnly(読取専用)です。
これが影響しているのではないでしょうか?

mRs1.Open "SELECT文", mCn, adOpenStatic, adLockOptimistic

こうすれば更新できるかと思います。


茶馬  2003-02-19 06:37:12  No: 77133

魔界の仮面弁士さん,takkさん  ありがとうございました。

ADODB.Streamを使用し
無事、解決することができました。m(__)m


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加