はじめて投稿します。
まず、以下のようなプログラムを書いています。
------------------------------------------------------------------------------------
'初期化
Set conEdit = New ADODB.Connection
Set rsEdtUser = New ADODB.Recordset
Call ConnectDB(conEdit)
'トランザクション開始
conEdit.BeginTrans
'SQL作成(全件検索)
strSQL = "SELECT * FROM テーブル名 ORDER BY ソートキー DESC"
'SQLに該当するレコードを行ロックでオープン
Call rsEdtUser.Open(strSQL, conEdit, adOpenDynamic, adLockPessimistic)
'レコード追加
rsEdtUser.AddNew
'ログインデータの作成
rsEdtUser.Fields("名前") = strName
rsEdtUser.Fields("ID") = strID
'登録
rsEdtUser.Update
rsEdtUser.Close
Set rsEdtUser = Nothing
'コミット
conEdit.CommitTrans
------------------------------------------------------------------------------------
このロジックを実行すると、AddNewの行で以下のエラーが発生します。
------------------------------------------------------------------------------------
現在の Recordset は更新をサポートしていません。
プロバイダか、選択されたロックタイプの限界の可能性があります。
------------------------------------------------------------------------------------
このエラーの解決方法を教えてください。
よろしくお願いします。
なお、環境は WindowsXP + VB6.0 + SQLServer(MSDE) です。
LockTypeをadLockOptimisticにしてみたらどうでしょうか?
たしかADOでは排他ロックは出来なかった気がします。
> Call ConnectDB(conEdit)
具体的な接続文字列を教えて下さい。(パスワード等は隠して頂いて構いませんので)
それから、CursorLocationの設定についても。
使用しているプロバイダによって、利用可能なカーソル種別が異なりますので、
この部分のコーディングが、最も重要な部分となります。
(2番目に重要なのは、RecordsetをOpenする部分のコードです)
例えば、Oracle 8.1.6 に MSDAORA プロバイダで接続した場合、
CursorLocation が adUseClient 以外になっていると、全て
読込専用カーソルになってしまう可能性があります。
> 'SQLに該当するレコードを行ロックでオープン
> Call rsEdtUser.Open(strSQL, conEdit, adOpenDynamic, adLockPessimistic)
プロバイダが、動的カーソル(adOpenDynamic)をサポートしているか、
確認してみてください。サポートしていないプロバイダの場合、Open後、
CursorTypeプロパティが adOpenDynamic 以外の値に変更されてしまうはずです。
例えば、Access 2000製の mdb に、Microsoft.JET.OLEDB.4.0 プロバイダで接続した場合、
CursorType は adOpenDynamic にはならず、adOpenKeyset(またはadOpenStatic)になります。
> rsEdtUser.Fields("名前") = strName
Valueプロパティの省略は、可能な限り避けてください。面倒でも、
rsEdtUser.Fields("名前").Value = strName
もしくは
rsEdtUser.Collect("名前") = strName
といった記述をお奨めします。
お返事が遅くなってしまい、すみません。
問題は解決しましたが、予想とは全く別の問題でした。
問題のコードで開いているテーブルは、別のDBからコピー
(テーブル構造ごとエクスポート)したものです。
この時にプライマリキー情報が消えてしまったために、
取得したRecordsetにプライマリキー情報が含まれておらず、
上記のエラーが発生していました。
結局、このようにコピーした全てのテーブルのキー情報を設定しなおしました。
ツイート | ![]() |