お世話になります。
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
よろしくお願いします。
特にエラーメッセージが出るわけでもないし、正常に処理される場合も
あるのね?
過去ログ検索『Access』などを実行して、データベース関連の不具合
にも目を通しました?とりあえず↓
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200509/05090130.txt
魔界の仮面弁士さんの書き込み、及びリンク先の内容を確認してみて下さい。
特攻隊まるるう様
早速のご回答ありがとうございます。
過去ログにも目を通してみたのですが、よくわかりませんでした。
リンク先の内容についてなのですが、
現在はテスト段階でmdbはネットワーク上ではなく、vbpと同じフォルダ内に
あります。
後にネットワーク上に置くことになるので、リンク先の内容はとても勉強になりました。
ありがとうございます。
>特にエラーメッセージが出るわけでもないし、正常に処理される場合も
>あるのね?
はい。DataGrid内に #ERROR と表示されるだけで、エラーメッセージのようなものはでません。セルをクリックすると、変更画面へ遷移するようになっているのですが、
もちろん #ERRORのセルをクリックすると、
実行エラー'6160'データアクセスエラーです。とでます。
(選択セルの値を変更画面で参照しているので当然だと思いこちらは問題視していないのですが。)
最初の書き込みから何度も実行していたのですが #ERRORと表示される場合に
規則性?のようなものがありそうです。
削除の手順は
DataGridのセルを選択(Ctylを押しながらで複数選択可能)
↓
Deleteボタンを押下
↓
「○件のデータを削除します。よろしいですか?」のメッセージ表示
↓
OKを押し、削除すると
↓
「削除しました。」のメッセージ表示
↓
OKを押すと、削除後のデータを一覧表示
なのですが、「削除しました。」のメッセージのOKボタンをかなり高速に押すと
#ERROR と表示「するようなのです。
必ずしもそれが原因だとは断言できないのですが…。
「削除しました。」と表示している行にブレークポイントを設定し一行ずつ実行すると100%うまくいっています。
Accessの更新スピードとプログラムの実行スピードが原因なんでしょうか?
学生の身で知識不足、失礼な点が多くあるとは思いますが、宜しくお願いします。
>「削除しました。」のメッセージのOKボタンをかなり高速に押すと
いや、だから先のリンク先の
>キャッシュ更新のタイミングの問題
では?
そもそも、SQL で削除するのではなく、バインドしている
adoRs の方を Delete すれば良いのでは。
そうすれば、削除済みレコードにアクセスされずに済むかと。
それから……下記を見る限りでは、どうもカーソルタイプの指定が、
適当になっている気がしています。
> adoRs.CursorLocation = adUseClient
> With adoRs
> .CursorLocation = adUseServer
データ件数や同時更新の状況などにもよりますが、DataGrid に
表示させるような場合は、サーバ側静的カーソルよりも、
クライアントカーソル、またはキーセットカーソルの方が
よいのでは無いでしょうか。
(クライアントカーソルにすれば、IRowsetIdentity の指定も不要ですし)
特攻隊長まるるう 様
魔界の仮面弁士 様
遅くなりましたが、解決しました!
魔界の仮面弁士様のアドバイスでレコードセットのDeleteメソッドを使用したら、#ERRORはでなくなりました。
後、カーソルタイプの指定も直しました。ご指摘ありがとうございます。
まだまだ勉強不足だということを改めて実感しました…。
特攻隊長まるるう様が教えてくださったリンク先の内容もかなり理解に苦しみました。もっと勉強します!!
本当にお忙しいところありがとうございました。
またお世話になることがあったときはご教示、宜しくお願いします。
ツイート | ![]() |