クラスで設定したプロパティ(レコードセット)にレコードを追加したいのですが、ご教授願います。
このプロパティにはDBよりレコードセットを抜いてきて格納しています。
このプロパティに書き込むことによって直接DBに反映させるのではなく、
変数のようなイメージでワークとして使いたいのですがADDNEWを使ったところ
エラーが発生してしまいます。(Deleteは通るのですが・・・)
エラー内容としては
現在のレコードセットは更新をサポートしていません。
プロバイダか、選択されたロックタイプの限界の可能性があります
というメッセージが出ます。
どなたか解決方法をご存知の方がいたらお教えください、お願いします。
> 変数のようなイメージでワークとして使いたいのですが
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に対して更新しているのであれば、
主キーが抽出結果に含まれているかどうかも確認してみてください。
魔界の仮面弁士さん書き込みありがとうございます。
>エラーメッセージから察するに、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
記入ミスがありましたすみません。
>まずは「読み取り専用カーソルになっていないか」を確認してみてください。
>主キーが抽出結果に含まれているかどうかも確認してみてください。
読取専用、主キーともに設定していません。
> '*********************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
こうすれば更新できるかと思います。
魔界の仮面弁士さん,takkさん ありがとうございました。
ADODB.Streamを使用し
無事、解決することができました。m(__)m
ツイート | ![]() |