10/10/2018, 00:15

Tại sao không thêm record mới được?

Tôi có đoạn code đơn giản sau dùng cập nhật vào csdl MS-Access 2003:

<%
dim sSQL

nickname = Request.Form("nickname")
desc = Request.Form("description")
url = Request.Form("url")

fullname = Request.Form("fullname")
email = Request.Form("email")

'Open Connection with the database...
Set oConn = Server.CreateObject("ADODB.Connection")
oConn.Open("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("db.mdb"))

sSQL = "insert into Webinfo (nickname,description,url,fullname,email) values "
sSQL = sSQL & "('" & nickname & "','" & desc & "','" & url & "','" & fullname & "','" & email & "')"

oConn.Execute(sSQL)

oConn.Close
set oConn = Nothing
%>

Khi chạy script thì báo lỗi:

Microsoft JET Database Engine (0x80004005)
Operation must use an updateable query.

Xin hỏi đây là lỗi gì? mà không thể cập nhật được. Bạn nào có bị trường hợp giống tôi không. Xin chỉ dùm chổ sai, cám ơn nhiều.
sacroyant viết 02:22 ngày 10/10/2018
Lâu lắm mới nhìn mã lệnh ASP, quên mịa nó hết roài

Theo tớ thì kiểu mở database của bạn chưa hợp lý, thử viết thế này xem :
PHP Code:
      Set oConn Server.CreateObject("ADODB.Connection")
      
oConn.Mode 3     
   oConn
.Open("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" &  Server.MapPath("db.mdb")) 
Với oConn.Mode = 3 , script mới có thể đọc và viết được vào database.

Tớ nghĩ vậy nhưng không chắc lắm đâu
duychuong viết 02:26 ngày 10/10/2018
Tôi có thử xem cách gợi ý của bạn rồi, nhưng kết quả cũng vậy. Thông báo lỗi là:

Microsoft JET Database Engine (0x80004005)
Operation must use an updateable query.

Tôi cũng thử dùng cách cập nhật bằng recordset, nhưng cũng không cập nhật được. Không rõ lý do.

Có bạn nào có ý tưởng khác không? Xin chỉ giúp.
bonholigan viết 02:20 ngày 10/10/2018
Được gửi bởi duychuong
Tôi có đoạn code đơn giản sau dùng cập nhật vào csdl MS-Access 2003:

<%
dim sSQL

nickname = Request.Form("nickname")
desc = Request.Form("description")
url = Request.Form("url")

fullname = Request.Form("fullname")
email = Request.Form("email")

'Open Connection with the database...
Set oConn = Server.CreateObject("ADODB.Connection")
oConn.Open("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("db.mdb"))

sSQL = "insert into Webinfo (nickname,description,url,fullname,email) values "
sSQL = sSQL & "('" & nickname & "','" & desc & "','" & url & "','" & fullname & "','" & email & "')"

oConn.Execute(sSQL)

oConn.Close
set oConn = Nothing
%>

Khi chạy script thì báo lỗi:

Microsoft JET Database Engine (0x80004005)
Operation must use an updateable query.

Xin hỏi đây là lỗi gì? mà không thể cập nhật được. Bạn nào có bị trường hợp giống tôi không. Xin chỉ dùm chổ sai, cám ơn nhiều.

Lỗi đấy là do bạn không set quyền ghi trên database

Bạn hãy click chuột phải vào thư mục web của bạn chọn Properties/Web Sharing/Share this folder. Một hộp thoại xuất hiện bạn đánh dấu vào tất cả các mục trong phần Access Permission thế là xong

Cách này là cách share thư mục web không nằm trong Inetput. Nếu thư mục web của bạn đã ở trong Inetput thì click chuột phải vào database và set quyền ghi là được

Chúc thành công
duychuong viết 02:19 ngày 10/10/2018
Cách viết khác là:

<%

dim sSQL

nickname = Request.Form("nickname")
desc = Request.Form("description")
url = Request.Form("url")

fullname = Request.Form("fullname")
email = Request.Form("email")

'Open Connection with the database...
Set oConn = Server.CreateObject("ADODB.Connection")
'Open recordset
set oRS = server.CreateObject("ADODB.Recordset")
oRS.LockType = 3
oRS.CursorType = 2
oConn.Open("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("db.mdb"))

sSQL="Select * from webinfo"
oRS.open sSQL,oConn

oRS.addnew
ors("nickname")=nickname
ors("descriptions")=desc
ors("url")=url
ors("email")=email
ors.update

ors.close
oConn.Close
set oConn = Nothing

%>

Kết quả nó vẫn không cập nhật được và thông báo lỗi:

Microsoft JET Database Engine (0x80040E09)
Cannot update. Database or object is read-only.

Xin cho biết lý do tại sao? Ai biết xin chỉ giùm.

Theo ý tôi thì khi mở trực tiếp file db.mdb thì xuất hiện thông báo sau:

This file may not be safe ì it contains code that was intended to harm your computer.

Đây có lẽ là nguyên nhân gây ra lỗi trên.
thatma viết 02:23 ngày 10/10/2018
Hì, hình như ngày xưa tui cũng gặp cái lỗi này. Có thể do mấy nguyên nhân sau
1) Cái File DB của bạn có thể đang để ở chế độ ReadOnly
2) Bạn vừa mở Access vừa chạy đoạn mã trên
3) Mấy lần chạy test trước, bạn quên đóng Connection (oConn.Close), nên hiện tại nó vẫn còn 1 file db.dbl ở dạng ẩn (hình như thế, tôi ko nhớ đuôi của nó là gì)
Cách khắc phục
Bạn thử tắt access của bạn, copy cái File DB của bạn ra một chỗ khác (Copy chứ ko phải đổi tên hay move nhé), Sửa lại kết nối và chạy đoạn mã đó xem thế nào
duychuong viết 02:21 ngày 10/10/2018
Tôi đã thử theo cách của bạn thatma:

- Vào xem thuộc tính properties của file db.mdb, nó không có bật chế độ Read-only gì cả.
- Thư mục chứa file db.mdb nằm trong thư mục con của \Inetpub\wwwroot
- Click chuột phải trên thư mục wwwroot,chọn properties, chọn tab web share. Chọn option share thí folder. Sau đó tôi check vào các quyền access permission là read, write luôn.

Cuối cùng kết quả vẫn không cập nhật được. Và thông báo mã lỗi là:

HTTP 500.100 - Internal Server Error - ASP error
Internet Information Services

Microsoft JET Database Engine (0x80040E09)
Cannot update. Database or object is read-only.

Bạn nào có ý kiến khác không? xin chỉ giúp.

[=========> Bổ sung bài viết <=========]

Mừng quá, tôi đã tìm ra nguyên nhân rồi nè!!!
Các bạn nào giống trường hợp tôi thì tham khảo đây.

Do chưa có quyền truy xuất vào datbase.

Cách xử lý cấp quyền truy xuất datbase của tôi như sau:

- Máy tôi cài IIS trên hện điều hành Windows XP SP2.
- Click chuột phải trên folder chứa csdl. Chọn properties, chọn tab Web share.
- Check vào option share thí folder.
- Sau đó chọn nút Edit Properties, bạn check vào hai ô Read/Write trong khung Access Pẻmission. Xong OK.

Kết quả chạy script thành công.
Bài liên quan
0