DataGridレコード削除後、再読込時セルに#ERRORとでます。

解決


harpy  2006-02-07 20:46:51  No: 130129

お世話になります。

VB6.0  Access2000を使用しております。(OS Windows2000)

DataGridでAccess2000のデータを一覧表示して追加・更新・削除が可能なプログラムを作成しています。

削除時にデータを削除すると、時たま(毎回ではない)レコードが削除されずのこっています。

セルをクリックすると中身が  #ERROR  となります。

これを回避するためになにかいい方法はないでしょうか?

コード↓

Private Sub DataGrid1_KeyDown(KeyCode As Integer, Shift As Integer)
    Dim c As Integer
    Dim lngRet          As Long
    Dim f As Boolean
    
    'Delete  Keyが押された場合
    If KeyCode = 46 Then
        
        c = DbGrdTrihikisakiData.SelBookmarks.Count
        lngRet = MsgBox(c & "件のデータを削除します。よろしいですか?", vbOKCancel, Me.Caption)
        If lngRet = vbCancel Then GoTo ExitCode
        
        f = True
        
        With Me.DataGrid1          
            Dim v As Variant
            For Each v In .SelBookmarks
            
                'データ削除
                If Not f_dbDelete(.Columns("0").CellValue(v)) Then
                    f = False
                End If       
            Next
        End With
        
        If f Then
            MsgBox ("削除しました。")
        Else
            MsgBox ("削除できませんでした。")
        End If
          
        'レコードセットを一度とじる
        adoRs.Close
        Call f_dbGridLoad(strSQL)     
        
    End If
End  Sub
Private Function f_dbDelete(ByVal cd As String) As Boolean
    Dim adoCn As ADODB.Connection
    Dim adoRs As ADODB.RecordSet
    
    Dim strSQL As String
    Dim lRowCnt As Long
    
    f_dbDelete = False
    
    Set adoCn = New ADODB.Connection
    adoCn.Open prstrCn
    Set adoRs = New ADODB.RecordSet
    
    'トランザクションの開始
    adoCn.BeginTrans
    
    strSQL = "DELETE * FROM Torihikisaki_Tbl "
    strSQL = strSQL & "WHERE TR_CD = '" & cd & "';"
    
    adoCn.Execute strSQL, lRowCnt
    
    adoCn.CommitTrans
    adoCn.Close
    
    If lRowCnt = 0 Then Exit Function
    
    f_dbDelete = True
    
    Exit Function
End Function
Private Function f_dbGridLoad(ByVal strSQL As String)

    adoRs.CursorLocation = adUseClient

        
    DataGrid1.Refresh
   
    With adoRs
        .ActiveConnection = adoCn
        .CursorLocation = adUseServer
        .CursorType = adOpenStatic
        .LockType = adLockOptimistic
        .Properties("IRowsetIdentity") = True
        .Open strSQL, , , , adCmdText
    End With
    
    If adoRs.EOF = False Then
        Debug.Print adoRs.Fields(0).Value
    End If
    Set DataGrid1.DataSource = adoRs
    
    DataGrid1.Refresh
       
End Function

よろしくお願いします。


特攻隊長まるるう  2006-02-07 22:20:56  No: 130130

特にエラーメッセージが出るわけでもないし、正常に処理される場合も
あるのね?

過去ログ検索『Access』などを実行して、データベース関連の不具合
にも目を通しました?とりあえず↓
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200509/05090130.txt
魔界の仮面弁士さんの書き込み、及びリンク先の内容を確認してみて下さい。


harpy  2006-02-07 23:05:51  No: 130131

特攻隊まるるう様

早速のご回答ありがとうございます。
過去ログにも目を通してみたのですが、よくわかりませんでした。

リンク先の内容についてなのですが、
現在はテスト段階でmdbはネットワーク上ではなく、vbpと同じフォルダ内に
あります。

後にネットワーク上に置くことになるので、リンク先の内容はとても勉強になりました。
ありがとうございます。

>特にエラーメッセージが出るわけでもないし、正常に処理される場合も
>あるのね?

はい。DataGrid内に  #ERROR  と表示されるだけで、エラーメッセージのようなものはでません。セルをクリックすると、変更画面へ遷移するようになっているのですが、
もちろん  #ERRORのセルをクリックすると、
実行エラー'6160'データアクセスエラーです。とでます。
(選択セルの値を変更画面で参照しているので当然だと思いこちらは問題視していないのですが。)

最初の書き込みから何度も実行していたのですが  #ERRORと表示される場合に
規則性?のようなものがありそうです。

削除の手順は
DataGridのセルを選択(Ctylを押しながらで複数選択可能)
  ↓
Deleteボタンを押下
  ↓
「○件のデータを削除します。よろしいですか?」のメッセージ表示
  ↓
OKを押し、削除すると
  ↓
「削除しました。」のメッセージ表示
  ↓
OKを押すと、削除後のデータを一覧表示

なのですが、「削除しました。」のメッセージのOKボタンをかなり高速に押すと
#ERROR  と表示「するようなのです。

必ずしもそれが原因だとは断言できないのですが…。

「削除しました。」と表示している行にブレークポイントを設定し一行ずつ実行すると100%うまくいっています。

Accessの更新スピードとプログラムの実行スピードが原因なんでしょうか?

学生の身で知識不足、失礼な点が多くあるとは思いますが、宜しくお願いします。


特攻隊長まるるう  2006-02-07 23:16:14  No: 130132

>「削除しました。」のメッセージのOKボタンをかなり高速に押すと
いや、だから先のリンク先の
>キャッシュ更新のタイミングの問題
では?


魔界の仮面弁士  2006-02-07 23:28:06  No: 130133

そもそも、SQL で削除するのではなく、バインドしている
adoRs の方を Delete すれば良いのでは。
そうすれば、削除済みレコードにアクセスされずに済むかと。

それから……下記を見る限りでは、どうもカーソルタイプの指定が、
適当になっている気がしています。

> adoRs.CursorLocation = adUseClient
> With adoRs
>   .CursorLocation = adUseServer

データ件数や同時更新の状況などにもよりますが、DataGrid に
表示させるような場合は、サーバ側静的カーソルよりも、
クライアントカーソル、またはキーセットカーソルの方が
よいのでは無いでしょうか。
(クライアントカーソルにすれば、IRowsetIdentity の指定も不要ですし)


harpy  2006-02-08 20:42:33  No: 130134

特攻隊長まるるう 様
魔界の仮面弁士  様

遅くなりましたが、解決しました!
魔界の仮面弁士様のアドバイスでレコードセットのDeleteメソッドを使用したら、#ERRORはでなくなりました。

後、カーソルタイプの指定も直しました。ご指摘ありがとうございます。

まだまだ勉強不足だということを改めて実感しました…。

特攻隊長まるるう様が教えてくださったリンク先の内容もかなり理解に苦しみました。もっと勉強します!!

本当にお忙しいところありがとうございました。
またお世話になることがあったときはご教示、宜しくお願いします。


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

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






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