Khắc phục lỗi record is deleted trong access

This is not a error that can be trapped by traditional error handling ["on error...". It is also not affected by DoCmd.setwarnings=false

I'm looking for some advice on how to trap or handle this item.

asked Aug 7, 2013 at 0:38

"Record is deleted" is run-time error 3167 and it can be trapped using normal On Error handling. This can be verified via VBA code like the following:

Sub foo[]
Dim cdb As DAO.Database, rst As DAO.Recordset
Set cdb = CurrentDb
Set rst = cdb.OpenRecordset["SELECT * FROM Table1 WHERE ID=26", dbOpenDynaset]
MsgBox "Waiting..."
On Error GoTo foo_Error
Debug.Print rst!ID
On Error GoTo 0
rst.Close
Set rst = Nothing
Set cdb = Nothing
Exit Sub
foo_Error:
MsgBox "Error " & Err.Number & ": " & Err.Description, vbOKOnly, "Trapped Error"
End Sub

If you run that code and then "delete the record out from under it" while the MsgBox is displayed then the rst! reference in the Debug.Print triggers the run-time error 3167 and the On Error catches it.

Check your code to see if there is an active On Error [possibly declared in an earlier calling procedure] that simply displays a plain MsgBox with the

Sub foo[]
Dim cdb As DAO.Database, rst As DAO.Recordset
Set cdb = CurrentDb
Set rst = cdb.OpenRecordset["SELECT * FROM Table1 WHERE ID=26", dbOpenDynaset]
MsgBox "Waiting..."
On Error GoTo foo_Error
Debug.Print rst!ID
On Error GoTo 0
rst.Close
Set rst = Nothing
Set cdb = Nothing
Exit Sub
foo_Error:
MsgBox "Error " & Err.Number & ": " & Err.Description, vbOKOnly, "Trapped Error"
End Sub

1. That would explain the behaviour you describe.

answered Aug 7, 2013 at 1:26

Gord ThompsonGord Thompson

119k32 gold badges223 silver badges423 bronze badges

Maybe you pull a record to delete from multiple tables... such as

sql = "SELECT columnA FROM tableA WHERE criteria"
set rec = currentdb.openrecordset[sql]
DoCmd.SetWarnings False
    DoCmd.RunSQL "DELETE FROM tableA WHERE columnA = " & rec[0]
    DoCmd.RunSQL "DELETE FROM tableB WHERE columnB = " & rec[0]
    DoCmd.RunSQL "DELETE FROM tableC WHERE columnC = " & rec[0]
    DoCmd.RunSQL "UPDATE tableD SET status WHERE columnD = " & rec[0]
DoCmd.SetWarnings True

This will fail on the second Delete line because rec[0] no longer exists on the second line, you just deleted it from tableA which is where your recordset comes from.

However,

DoCmd.SetWarnings False
    DoCmd.RunSQL "DELETE FROM tableB WHERE columnB = " & rec[0]
    DoCmd.RunSQL "DELETE FROM tableC WHERE columnC = " & rec[0]
    DoCmd.RunSQL "UPDATE tableD SET status WHERE columnD = " & rec[0]
    DoCmd.RunSQL "DELETE FROM tableA WHERE columnA = " & rec[0]
DoCmd.SetWarnings True

will work. It may not be the best practice method, but if you have this error, try this to see if the recordset being deleted is the reason.

A better method might be to declare a variable and assign rec[0].value to that variable. Then use the variable in place of rec[0] in the code.

Những lỗi thường gặp khi làm việc với CSDL. Trong bài viết này, chúng tôi sẽ liệt kê mốt số lỗi và hướng giải quyết thường gặp khi làm việc với CSDL.

1. Cannot update. Database or object is read-only 2. Operation must use an updateable query Hai lỗi này thường gặp trên CSDL Access, là lỗi chỉ cho phép đọc CSDL. Có 2 nguyên nhân chính : + Nếu ổ đĩa của bạn quản lý file bằng hệ thống NTFS thì bạn nên cấp quyền write cho thư mục chứa CSDL. + Nếu bạn chưa cấu hình IIS chút nào thì bạn nên chỉnh sửa một số phần về Security.

3. General error Unable to open registry key. Thường thì nguyên nhân là do đường dẫn đến CSDL của bạn viết sai. Bạn chú ý là đường dẫn tới CSDL phải là đường dẫn vật lý, không phải đường dẫn tương đối. 4. Could not use ‘[unknown]’; file already in use 5. Table ‘tblTable’ is exclusively locked by user ‘Admin’ on machine ‘MyMachine’ Những lỗi xảy ra khi file CSDL của bạn [mdb, mdf …] đang được sử dụng bởi một phần mềm nào khác, và bạn không thể cập nhật nó. Bạn hãy tắt hết các phần mềm mà bạn cho là đang sử dụng CSDL của bạn. Ví dụ như khi bạn đang mở file CSDL của bạn bằng Access và ở trong Design View, bạn có thể gặp lỗi số 5. 6. Too few parameters. Expected 1 7. No value given for one or more required parameters 8. Item cannot be found in the collection corresponding to the requested name or ordinal Những lỗi xảy rakhi bạn sử dụng một câu SQL mà trường mà bạn gọi ra không tồn tại. Ví dụ khi bạn thực thi câu SQL : "Select * from Tin where nguon_tin = ‘Vnexpress’ ", nhưng trong bảng "Tin" của bạn không có trường nào là "nguon_tin" cả thì bạn sẽ gặp lỗi . Lỗi rất hay xảy ra khi bạn đánh sai tên trường. 9. Cannot find the input table or query ‘Tbl’. Make sure it exists and that its name is spelled correctly. Lỗi khi bạn đánh sai tên bảng trong câu SQL. 10. Either BOF or EOF is True, or the current record has been deleted. Lỗi khi bạn cố gắng truy xuất một dòng record đã bị xóa. Lỗi này rất hay xảy ra khi bạn làm trang xóa dữ liệu. Bạn chạy trang – dữ liệu bị xóa – bạn Refresh trang – dữ liệu không tồn tại cho bạn xóa lỗi. Hoặc cũng có thể khi bạn truyền biến ID cho trang xóa dữ liệu, nhưng biến ID bị sai, và CSDL không tìm thấy. Giải pháp toàn diện nhất là bạn hãy kiểm tra dữ liệu có tồn tại hay không trước khi bạn xóa bất kì cái gì. 11. Syntax error in FROM clause 12. Syntax error. in query expression ‘select’. Hai lỗi này thường xảy ra khi câu SQL của bạn viết sai quy tắc. Thế nhưng lỗi sai đôi khi không phải do bạn viết sai quy tắc mà do bạn đặt sai tên bảng, tên trường. Ví dụ bạn đặt tên bảng của bạn là "Order" để lưu tên các đơn đặt hàng. Và thế là bạn có một câu SQL khá hay ho : "Select * from Order". Order là một từ khóa dùng trong câu SQL , vì thế câu SQL của bạn bị sai cấu trúc. 13. Operation is not allowed when the object is closed. Lỗi này xảy ra khi bạn cố gắng thực thi câu lệnh : "RS.Open …" hoặc "RS.MoveNext" với RS là một đối tượng recordset của bạn. Nguyên nhân là do bạn đã gọi ra phương thức "close" của đối tượng này ở trước đó. Vì vậy, hãy kiểm tra để chắc rằng bạn không đặt một dòng "RS.close" phía trên 1 dòng "RS.Open …. " hay "RS.MoveNext" 14. Data type mismatch in criteria expression. Lỗi sai kiểu dữ liệu. Lỗi này thường gặp khi bạn thực thi 1 câu SQL có mệnh đề where, và kiểu dữ liệu bạn dùng để so sánh là sai . Ví dụ :

"SELECT * FROM Tin WHERE ngay_dang_tin = ’12/3/2006’ "

Trên đây , trường "ngay_dang_tin" có kiểu dữ liệu "DateTime" , bạn so sánh nó với số 1 là kiểu dữ liệu chuỗi , và gây ra lỗi. Điều này sẽ được nói rõ hơn ở phần làm trang tìm kiếm. 15. Current Recordset does not support updating. This may be a limitation of the provider, or of the selected locktype. Lỗi này xảy ra khi bạn cố gắng dùng recordset để cập nhật dữ liệu, và bạn quên thiết lập một thông số quan trọng cho recordset, đó là LockType . Nếu bạn muốn cập nhật dữ liệu [xóa, sửa , thêm dữ liệu] thì bạn phải thêm dòng in đậm này trước khi thực thi dòng "RS.Open …."

SQL = "……………….." RS.LockType = 3 RS.Open SQL, conn

16 Multiple-step OLE DB operation generated errors. Check each OLE DB status value, if available. No work was done. Lỗi này là một trong những lỗi khó tìm nguyên nhân nhất khi thao tác với CSDL, bởi lỗi này không phải bao giờ bạn cũng gặp. Có thể bạn thêm 1 sản phẩm vào CSDL, mọi thứ hoạt động trơn tru, và ngay sau đó, bạn thêm 1 sản phẩm khác vào CSDL , bạn lại gặp lỗi này. Nguyên nhân thường trực nhất của lỗi này là sai kiểu dữ liệu và sai độ dài dữ liệu . Hãy tưởng tượng khi thiết kế CSDL , bạn tạo 1 trường text để ghi tên sản phẩm có độ dài giới hạn 50 kí tự. Lúc đầu bạn thêm vào đó 1 cái tên sản phẩm 20 kí tự – không hề có vấn đề gì. Một lúc sau bạn thêm 1 dòng chú thích dài 31 kí tự vào, và thế là lỗi xảy ra. Cách khắc phục lỗi là, hãy kiểm tra hết khả năng có thể trước khi bạn nhập một cái gì đó vào CSDL. 17. Field ‘product. detail’ cannot be a zero-length string Lỗi này xảy ra khi bạn nhập dữ liệu rỗng vào 1 trường không cho phép có dữ liệu rỗng. Có 2 cách giải quyết. Một là bạn sửa lại trường đó để cho phép giá trị rỗng [null]. Hai là bạn kiểm tra giá trị của nó trước khi nhập vào CSDL. 18. You cannot add or change a record because a related record is required in table ‘tbl’. Lỗi này xảy ra khi bạn thêm hoặc update một bản ghi trong CSDL, khi mà CSDL của bạn có Relation [quan hệ] giữa các Table. Ví dụ là khi bạn tạo bảng danh_muc_hang, có trường danh_muc_ID, 1 bảng khác là bảng san_phamdanh_muc. Bạn tạo 1 mối quan hệ 1-n giữa 2 trường danh_muc_ID và danh_muc , nghĩa là bạn chỉ được phép thêm vào trường danh_muc những giá trị đã có trong trường danh_muc_ID. Lỗi trên xảy ra khi bạn cố gắng thêm 1 gía trị không có trong danh_muc_ID vào trong danh_muc. Thường thì bạn vẫn làm thế này : Tạo 1 select box lấy dữ liệu từ trường danh_muc_ID, sau đó chọn 1 cái và insert vào trường danh_muc. Tuy nhiên trong quá trình xử lý biến bạn đã làm sai lệch đi giá trị của biến này, và lỗi xảy ra. 19. Lỗi các dữ liệu xuất ra không xuống dòng. Tình trạng là thế này : Bạn chèn vào CSDL một đoạn văn nhập từ , bạn rõ ràng có xuống dòng lúc đánh văn bản, thế nhưng khi hiện ra thì đoạn văn lại không xuống dòng. Tất cả liền lại thành 1 dòng duy nhất. Bạn hãy nhấp chuột phải, chọn ViewSource trong trang web, và bạn hãy nhìn vào đoạn văn của mình. Ở trong Source Code cả đoạn văn vẫn xuống dòng một cách chính xác. Vậy vấn đề là gì ? Vấn đề là trang web của bạn chỉ xuống dòng khi trong code HTML của bạn có thẻ
. Các kí tự xuống dòng trong SourceCode sẽ không xuống dòng trong trang web. Bạn hãy thay thế tất cả các kí tự xuống dòng bằng "
" sử dụng hàm Replace[] Thay vì viết : Response.Write RS["noi_dung"] Thì bạn hãy viết : Response.Write Replace [ RS["noi_dung"] , chr[13] , "
" ] Chr[13] chính là kí tự xuống dòng của bạn. Hàm Replace sẽ thay thế toàn bộ các kí tự này bằng "
". Theo hotrolaptrinh

Chủ Đề