ADODB.Recordsetのデータを更新するには?

解決


きさらぎ  2003-06-09 20:11:13  No: 78197

はじめて投稿します。
まず、以下のようなプログラムを書いています。

    ------------------------------------------------------------------------------------
    '初期化
    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) です。


nanashi  2003-06-09 21:43:43  No: 78198

LockTypeをadLockOptimisticにしてみたらどうでしょうか?
たしかADOでは排他ロックは出来なかった気がします。


魔界の仮面弁士  2003-06-10 00:35:25  No: 78199

>    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
といった記述をお奨めします。


きさらぎ  2003-06-13 19:47:28  No: 78200

お返事が遅くなってしまい、すみません。

問題は解決しましたが、予想とは全く別の問題でした。
問題のコードで開いているテーブルは、別のDBからコピー
(テーブル構造ごとエクスポート)したものです。
この時にプライマリキー情報が消えてしまったために、
取得したRecordsetにプライマリキー情報が含まれておらず、
上記のエラーが発生していました。

結局、このようにコピーした全てのテーブルのキー情報を設定しなおしました。


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

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






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