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

解決


茶馬  2003-02-17 21:26:19  No: 77128  IP: [192.*.*.*]

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

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

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

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

編集 削除
魔界の仮面弁士  2003-02-18 02:20:55  No: 77129  IP: [192.*.*.*]

> 変数のようなイメージでワークとして使いたいのですが
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 09:17:25  No: 77130  IP: [192.*.*.*]

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

>エラーメッセージから察するに、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 09:21:49  No: 77131  IP: [192.*.*.*]

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

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

編集 削除
takk  2003-02-18 10:16:11  No: 77132  IP: [192.*.*.*]

>  '*********************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-18 21:37:12  No: 77133  IP: [192.*.*.*]

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

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

編集 削除