症狀當您將ActiveX 資料物件(ADO) 與Active Server Pages (ASP) 一起使用時,可能會遇到以下常見錯誤:
Microsoft OLE DB Provider for ODBC Drivers error '80004005'
[Microsoft][ODBC Microsoft Access 97 Driver] Operation must use an updateable query.
原因本文闡述導致此錯誤的四種主要原因及相應的替代方法。儘管本文討論的是Microsoft Access 資料庫,但此處提供的資訊也適用於其他類型的資料庫。
解決方案當您的腳本試圖執行更新或執行會更改資料庫中的資訊的其他某種操作時,通常會遇到此錯誤。出現此錯誤的原因是ADO 由於以下某種原因而無法寫入資料庫:
1. 最常見的原因是Internet 來賓帳戶(IUSR_MACHINE,預設情況下該帳戶屬於「Everyone」群組)對資料庫檔案(.mdb) 沒有寫入權限。若要解決此問題,請使用Explorer 中的「安全性」標籤來調整此檔案的屬性,以便Internet 來賓帳戶具有正確的權限。
注意:在將Microsoft Access 資料庫與ADO 一起使用時,也必須授予Internet 來賓帳號對包含.mdb 檔案的目錄的寫入權限。這是因為Jet 會建立一個用於處理資料庫鎖定的.ldb 檔案。由於Jet 可能會在「Temp」目錄中建立臨時文件,因此您可能還需要授予對該資料夾的讀取/寫入權限。
2. 出現此錯誤的第二個原因是資料庫不是使用具有寫入權限的正確模式開啟的。如果您對Connection 物件執行Open 操作,則應使用Mode 屬性指示對該連線所擁有的權限,如下所示:
SQL = "UPDATE Products Set UnitPrice = 2;"
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Mode = 3 '3 = adModeReadWrite
Conn.Open "myDSN"
Conn.Execute(SQL)
Conn.Close
注意:預設情況下,MODE 設定為0(adModeUnknown),該值通常允許更新。
3. 出現此錯誤的另一個原因是:在ODBC 管理員中,DSN 的「選項」頁中的「唯讀」設定可能會被選取。
4. 最後一個問題和替代方法適用於所有SQL 資料來源。違反資料庫的參考完整性的SQL 語句可以導致此錯誤。以下是一些最常見的失敗的查詢:
• 其中最簡單的一組查詢是以下您無法變更的查詢:UniqueValue 屬性設定為Yes 的交叉表查詢、SQL 傳遞查詢、聯合查詢或更新(即產生表)操作查詢。
• 另一個非常常見的原因是聯結包含的連結ODBC 表的索引不是唯一的。在這種情況下,SQL 無法保證表中的記錄是唯一,該表中欄位的值將隨查詢發生變更。
• 有一種原因確實有可靠的替代方法。如果您嘗試更新「一對多」查詢的「一」方的聯結字段,操作將會失敗,除非您啟用級聯更新。因為這樣您就可以將參考完整性委託給JET 引擎。