下面是代码,请大虾帮忙找找错,我实验的结果是新增是正常的,但是在删除的时候,如果通过按键来控制rstCP的移动,找到某条记录并删除,就会出现:“行句柄引用了一个已被删除的行或被标示未删除的行”的错误,但是我如果在DATAGRID上单击某条记录来定位的话,删除的时候就没问题。 Dim rstCP As ADODB.Recordset ...... Set GridCP.DataSource = rstCP ...... Case Is = "new" '新增 Enable rstCP.AddNew init btnset1 txtfield(0).SetFocusCase Is = "delete" '删除 If MsgBox("确定删除该记录?", 49) = 1 And rstCP.RecordCount > 0 Then rstCP.Delete rstCP.MoveNext If rstCP.RecordCount > 0 Then If rstCP.EOF Then rstCP.MovePrevious End If GetData Else MsgBox "记录全部都删除了!", vbOKOnly, "产品设置" init End If End If If rstCP.RecordCount > 0 Then btnset2 Else btnset3 End IfCase Is = "save" '保存 SaveData If rstCP.EditMode = adEditInProgress Then rstCP.Update Else If rstCP.EditMode = adEditAdd Then rstCP.Update rstCP.MoveFirst End If End If GetData btnset2 DisableCase Is = "first" '第一个记录 rstCP.MoveFirst GetDataCase Is = "previous" '前一个记录 rstCP.MovePrevious If rstCP.BOF Then MsgBox "到头了!", vbOKOnly, "系统提示" rstCP.MoveFirst End If GetDataCase Is = "next" '后一个记录 rstCP.MoveNext If rstCP.EOF Then MsgBox "到底了!", vbOKOnly, "系统提示" rstCP.MoveLast End If GetDataCase Is = "last" '末一个记录 rstCP.MoveLast GetData ....... Private Sub GridCP_Click() rstCP.Find ("产品编号='" & GridCP.Columns(0).Value & "'"), , adSearchForward, 1 GetData End Sub .......
你是用Set GridCP.DataSource = rstCP来给Datagrid1赋值的,因此你用键盘移动Datagrid的记录时,并没有移动rstCP的指针,你可以在rstCP.Delete语句之前加上这么一句,应该就可以了: If MsgBox("确定删除该记录?", 49) = 1 And rstCP.RecordCount > 0 Then if not (GridCP.DataSource is nothing) then set rstCP=GridCP.DataSource else exit sub end if rstCP.Delete rstCP.MoveNext If rstCP.RecordCount > 0 Then If rstCP.EOF Then rstCP.MovePrevious End If GetData Else MsgBox "记录全部都删除了!", vbOKOnly, "产品设置" init End If end if
Dim rstCP As ADODB.Recordset
......
Set GridCP.DataSource = rstCP
......
Case Is = "new" '新增
Enable
rstCP.AddNew
init
btnset1
txtfield(0).SetFocusCase Is = "delete" '删除
If MsgBox("确定删除该记录?", 49) = 1 And rstCP.RecordCount > 0 Then
rstCP.Delete
rstCP.MoveNext
If rstCP.RecordCount > 0 Then
If rstCP.EOF Then
rstCP.MovePrevious
End If
GetData
Else
MsgBox "记录全部都删除了!", vbOKOnly, "产品设置"
init
End If
End If If rstCP.RecordCount > 0 Then
btnset2
Else
btnset3
End IfCase Is = "save" '保存
SaveData
If rstCP.EditMode = adEditInProgress Then
rstCP.Update
Else
If rstCP.EditMode = adEditAdd Then
rstCP.Update
rstCP.MoveFirst
End If
End If
GetData
btnset2
DisableCase Is = "first" '第一个记录
rstCP.MoveFirst
GetDataCase Is = "previous" '前一个记录
rstCP.MovePrevious
If rstCP.BOF Then
MsgBox "到头了!", vbOKOnly, "系统提示"
rstCP.MoveFirst
End If
GetDataCase Is = "next" '后一个记录
rstCP.MoveNext
If rstCP.EOF Then
MsgBox "到底了!", vbOKOnly, "系统提示"
rstCP.MoveLast
End If
GetDataCase Is = "last" '末一个记录
rstCP.MoveLast
GetData
.......
Private Sub GridCP_Click()
rstCP.Find ("产品编号='" & GridCP.Columns(0).Value & "'"), , adSearchForward, 1
GetData
End Sub
.......
if not (GridCP.DataSource is nothing) then
set rstCP=GridCP.DataSource
else
exit sub
end if
rstCP.Delete
rstCP.MoveNext
If rstCP.RecordCount > 0 Then
If rstCP.EOF Then
rstCP.MovePrevious
End If
GetData
Else
MsgBox "记录全部都删除了!", vbOKOnly, "产品设置"
init
End If
end if
可能是我上面的描述不太清楚,造成了你的误解。
“在删除的时候,如果通过按键来控制rstCP的移动,找到某条记录并删除”
我这里的按键的意思是说工具条上的按键:”第一条“、”下一条“、”上一条“、”末一条“,我是通过它们来移动rstCP的。
我以前也出现过类似的问题,改了CACHESIZE属性后就好了
不过对于上面那个问题仍然不解中
rstCP.CursorLocation =adUseClient
如果没有,在添加记录后该记录不会马上写入数据库(即使update也不行),这时候游标指针没有指向任何记录,当然无法删除啦.
是向你说的那样做的
出现那个错误之后,点”确定“,重新载入窗体或者到数据库中看,记录已被删除。
PS:偶用的是ACCESS2002
是不是记录缓冲在搞鬼呀,
我以前也出现过类似的问题,改了CACHESIZE属性后就好了
-------------------------
能否详细说说?