top
Loading...
80004005及其它錯誤消息的疑難解答

這篇文章中的信息適用于:

Microsoft Data Access Components versions 1.5, 2.0, 2.1, 2.5
Active Server Pages
Microsoft Visual InterDev, version 1.0

--------------------------------------------------------------------------------


概要
本文詳細講述了 Microsoft 數據訪問組件 (MDAC) 收到 0x800040005 錯誤的一些常見原因,MDAC 包括 ActiveX 數據對
象、OLE DB 和遠程數據服務 (RDS)。 同時,本文還討論了其它一些錯誤消息,包括 80040e21、80040e14 和
80040e10。


更多信息
80004005 錯誤消息可歸納為:“出于某種原因,我無法訪問您的數據”。 本文給出了各種 80004005 錯誤消息的列表、
其中列舉了這些錯誤消息的最常見起因及其疑難解答步驟。 雖然本文假定您是在 Active Server Page (ASP) 頁面
(.asp) 中使用 ActiveX 數據對象 (ADO),但這些起因和很多疑難解答步驟同樣適用于任何其它通過 ODBC 訪問數據的環
境。

錯誤消息列表
這一節我們介紹了各種錯誤消息的文本,以及導致錯誤的原因。
錯誤消息
Microsoft OLE DB Provider for ODBC Drivers error '80004005' [Microsoft][ODBC Microsoft Access 97 Driver]
The Microsoft Jet database engine cannot open the file '(unknown)'. It is already opened exclusively by
another user, or you need permission to view its data.
原因
該錯誤的發生,通常是因為 Internet Information Server (IIS) 所使用的帳戶(通常是 IUSR)沒有正確的 Windows
NT 權限,因而無法訪問基于文件的數據庫或包含文件的文件夾。


請檢查這些文件和文件夾的權限設置。 確認您能夠創建和/或刪除任何臨時文件。 臨時文件一般都創建在與數據庫相同的
文件夾下,但也可以創建在其它文件夾下,如 /Winnt。


您可以使用 Windows NT 文件監視器來檢查訪問文件失敗的原因。 Windows NT 文件監視器可從以下 Web 站點上得到:
http://www.sysinternals.com 。


如果您使用的是該數據庫的網絡路徑(UNC 或映像驅動器),請檢查共享、文件及文件夾上的權限。


確認文件及數據源名 (DSN) 沒有被標記為獨占方式。


簡化。 使用一個使用本地驅動器號的系統 DSN。 如有必要,把數據庫移至本地驅動器,然后對其進行測試。


錯誤消息中的 other user(其它用戶)有可能是 Visual InterDev。 請關閉任何包含該數據庫數據連接的 Visual
InterDev 工程。


錯誤也可能是由委派問題引起的。 檢查可能存在的任何身份驗證方法(“基本”而不是 NTLM)。 如果連接字符串使用的
是統一命名約定 (UNC),請嘗試使用“基本身份驗證”或一個絕對路徑,如 C:MydataData.mdb。即使 UNC 指向的資源
位于本地 IIS 計算機,前述錯誤也有可能發生。


當訪問鏈接到某個表的 Microsoft Access 數據庫時,如果這一表處在網絡服務器上的 Access 數據庫中,這一錯誤也有
可能發生。 這種情況下,請參見以下 Microsoft Knowledge Base 文章以找到可行的解決方法:
Q189408 PRB: ASP 無法訪問 IIS 4.0 下的網絡文件


錯誤消息
Microsoft OLE DB Provider for ODBC Drivers error '80004005' [Microsoft][ODBC Microsoft Access 97 Driver]
Couldn't use '(unknown)'; file already in use.
原因
數據庫無法正確地為多個用戶鎖定。 詳細信息請參見以下 Microsoft Knowledge Base 文章:
Q174943 PRB: 80004005“Couldn't Use '(unknown)';File Already in Use”
錯誤消息
Microsoft OLE DB Provider for ODBC Drivers error '80004005' [Microsoft][ODBC Driver Manager] Data source
name not found and no default driver specified.
原因
最常見的原因是因為 Global.asa 和 Global.asa 中初始化的連接字符串會話變量沒有激發。 您可以通過在 .asp 頁面中
加入以下代碼,來檢查該變量有沒有正確地初始化:
<%= "'auth_user' is " & request.servervariables("auth_user")%>
<P>
<%= "'auth_type' is " & request.servervariables("auth_type")%>
<P>
<%= "connection string is " & session("your_connectionstring")%>
<P>

另一個常見原因是因為所使用的連接字符串中有太多的空格。
DSN = MyDSN; Database = Pubs;

嘗試使用下面的語法代替:
DSN=MyDSN;Database=Pubs;

如果 Global.asa 文件沒有激發,請檢查并確認它是在 IIS 4.0 的應用程序根下,(如果運行的是 IIS 3.0,則應在虛擬
根下,并且 Execute 復選框已經選中)。 此外,當 Windows NT 權限限制了對文件夾的訪問時,程序設計中的一個錯誤
也可能會妨礙 Global.asa 文件被激發。詳細信息請參見 Microsoft Knowledge Base 文章: Q173742 “BUG: 限制
Web 訪問時,Global.asa 不被執行”


無法找到 DSN 名。 請檢查并確認沒有使用“用戶”類型的 DSN。


如果使用的是文件 DSN 或系統 DSN,則嘗試把連接字符串相應地改為 DSN=MySystemDSN 或 DBQ=MyFileDSN。 簡化!

檢查并確認安裝了最新的驅動程序。 如有您不能肯定,請從以下 Web 站點下載最新的 MDAC(Microsoft 數據訪問組
件):
http://www.microsoft.com/data/


錯誤消息
Microsoft OLE DB Provider for ODBC Drivers error '80004005' [Microsoft][ODBC Driver Manager] Data source
name not ??
原因
這個問題看起來與計算機上軟件安裝或卸載的順序有關。 如果 ODBC 內核文件不同步(它們必須為同一版本),就可能出
現這種錯誤。

請從以下 Web 站點下載最新版的 MDAC(Microsoft 數據訪問組件),以升級所有的 ODBC 核心驅動程序:
http://www.microsoft.com/data/
錯誤消息
Microsoft OLE DB Provider for ODBC Drivers error '80004005' [Microsoft][ODBC Access 97 ODBC driver Driver]
General error Unable to open registry key 'DriverId'.
原因
這一錯誤是由從注冊表中讀取數值時引起的。 請用注冊表編輯器 (Regedt32.exe) 檢查注冊表項上設置的權限。 您也可
以用 Windows NT 注冊表監視器 (NTRegMon) 來檢查注冊表讀取失敗。 NTRegMon 可從以下 Web 站點下載:
http://www.sysinternals.com
錯誤消息
Microsoft OLE DB Provider for ODBC Drivers error '80004005' [Microsoft][ODBC SQL Server Driver][dbnmpntw]
ConnectionOpen (CreateFile()).
原因
這一錯誤有兩種原因。 它們都與權限有關,或者數據庫與 Web 服務器不在一臺計算機上,或者數據庫正通過 UNC 路徑
(\ServerShare) 被引用。 即使數據庫與 Web 服務器位于同一臺計算機上,UNC 路徑也使 Web 服務器認為數據庫好象
位于網絡上的另一臺計算機上。
如果 .asp 頁面正被匿名用戶所訪問,就會發生以下情況:

IIS 將使用(默認)Windows NT 帳戶:
USR_<machinename
>。

因為該帳戶是 Web 服務器的本地賬戶,所以網絡上的其它計算機根本無從得知該帳戶。 當 IIS(在 IUSR 帳戶的安全環
境下運行)試圖訪問遠程計算機上的任何資源時,遠程計算機將驗證其使用的帳戶。 由于 IUSR 帳戶是本地帳戶,因此對
于遠程計算機來說,它是無從得知的,所以訪問被拒絕。

當匿名訪問引發這個問題時,有兩個解決辦法:


在“Internet 服務管理器”工具中,從 Web 屬性下將匿名登錄帳戶從默認的本地帳戶改為一個基于域的有效帳戶。 在用
戶名字段中,輸入要使用的域帳戶,格式為 domainuserid。 這樣,遠程計算機就能用域控制器來驗證 IIS 傳遞給它的
安全憑據。

-或者-


在包含您想要訪問的資源的遠程計算機上復制的帳戶
IUSR_<machineaccount
>

。 如果帳戶是在遠程計算機上創建的,包含完全相同的名稱和密碼,Windows NT 把它們視為等價帳戶。

-或者-


如果 .asp 頁面只允許經身份驗證的訪問,請參考以下內容:

如果頁面不允許匿名訪問,IIS 將會試圖驗證作出請求的用戶的身份,并使用其安全憑據控制其所有活動,如訪問數據庫
的活動。 下面對這種情形下失敗的兩個主要原因做了說明。


默認情況下,IIS 被配置為以 Windows NT Challenge/Response 作為其身份驗證方法。 由于 Windows NT 4.0(及更早版
本)安全模型的限制,經過 Windows NT Challenge/Response 身份驗證的用戶也無法訪問遠程計算機上的資源。 這通常
稱為委派問題。 要驗證是不是這種情況,可在“Internet 服務管理器”工具中,從 Web 屬性下選擇基本(明文)復選
框,然后清除 Windows NT Challenge/Response。 如果這一步驟解決了問題,很明顯這是一個委派問題。

-或者-


如果問題仍舊存在,可能是所使用的用戶帳戶沒有正確的 SQL Windows NT 計算機權限。 不妨嘗試使用一個明確擁有該
SQL 計算機訪問權限的帳戶。


有關委派、IIS 如何通過身份驗證來保護 Web 站點,以及相關問題的詳細信息,請參見文章“IIS Authentication and
Security for Internet Developers”,它位于以下 Web 站點:
http://www.microsoft.com/workshop/server/feature/security.asp


錯誤消息
Microsoft OLE DB Provider for ODBC Drivers error '80004005' Microsoft][ODBC Microsoft SQL Driver] Logon
Failed()
原因
該錯誤是在 SQL 服務器不接受或不認可所提交的登錄帳戶及/或密碼(使用標準安全性時),或者沒有任何 Windows NT
帳戶映射到 SQL 帳戶(使用集成安全性時)時,由 SQL 服務器生成的。
如果使用的是標準安全性,說明 SQL 帳戶名和密碼不正確。 請嘗試使用系統管理員帳戶和密碼(UID= "SA",密碼為
空)。 這些必須在連接字符串行中定義, 因為 DSN 不存儲用戶名和密碼。


如果使用的是集成安全性,則檢查調用頁面的 Windows NT 帳戶,找出它所映射的目標帳戶。


SQL 不允許 SQL 帳戶名中有下劃線。 如果某人把 Windows NT 帳戶 IUSR_machinename 手動映射到一個同名的 SQL 帳
戶,就會失敗。 請把所有包含下劃線的帳戶都映射為 SQL 中不包含下劃線的帳戶名。


錯誤消息
Microsoft OLE DB Provider for ODBC Drivers error '80004005' [Microsoft][ODBC SQL Server Driver][SQL
Server] Login failed- User: Reason: Not defined as a valid user of a trusted SQL Server connection.
原因
SQL Enterprise Manager(企業管理器)中打開了集成安全性,而所使用的 Windows NT 帳戶未被映射到 SQL 帳戶。


請嘗試把 SQL 改用標準安全性(在 Enterprise Manager 中,選擇 Server/SQL Server/Configure/Security
Options/Standard。


如果您是在 IIS 4.0 下運行,則取消選擇該工程的密碼同步。


錯誤消息
Microsoft OLE DB Provider for ODBC Drivers error '80004005' [Microsoft][ODBC Microsoft Access 97 Driver]
Couldn't lock file.
原因
這一錯誤可能是由于沒有正確的權限為 Microsoft Access 數據庫創建鎖定文件 (.ldb) 而引起的。 默認情況下,鎖定文
件與 Microsoft Access .mdb 文件創建在同一文件夾下。


請嘗試賦予訪問數據庫(通常是 IUSR_machinename)的用戶以共享/文件夾的完全控制權限。


有時,共享文件夾權限被設置為只讀。 您也可以嘗試更改連接模式,這時可以使用以下示例代碼:
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Mode = adModeShareDenyWrite '8
'From Adovbs.inc
'---- ConnectModeEnum Values ----
'Const adModeUnknown = 0
'Const adModeRead = 1
'Const adModeWrite = 2
'Const adModeReadWrite = 3
'Const adModeShareDenyRead = 4
'Const adModeShareDenyWrite = 8
'Const adModeShareExclusive = &Hc
'Const adModeShareDenyNone = &H10

錯誤消息
Microsoft OLE DB Provider for ODBC Drivers error '80004005' [Microsoft][ODBC Microsoft Access 97
Driver] '(unknown)' isn't a valid path. Make sure that the path name is spelled correctly and that you are
connected to the server on which the file resides.
原因
Web 服務器所讀取的路徑是無效路徑。 當 Global.asa 文件正被使用,而連接字符串是 Web 服務器之外的另一臺計算機
上創建的時候,最容易發生這種錯誤。 如果路徑是一個映像驅動器號,它可能只對創建連接字符串的客戶計算機有效。
錯誤消息
Microsoft OLE DB Provider for ODBC Drivers error '80004005' [Microsoft][ODBC SQL Server Driver][SQL
Server] The query and the views in it exceed the limit of 16 tables.
原因
查詢過于復雜。 在查詢中有過多的限制。
錯誤消息
Microsoft OLE DB Provider for ODBC Drivers error '80004005' [Microsoft][ODBC SQL Server Driver][DBNMPNTW]
ConnectionWrite (GetOverLappedResult()).
原因
“允許匿名用戶”環境被關閉時,Windows NT 在第一個請求完成后要關閉與 SQL Server 連接的管道。 這是因為,第一
個到 SQL Server 的連接是在 IIS 匿名用戶帳戶中建立的。 然后,IIS 或者選擇在同一線程上模擬瀏覽器客戶,或者嘗
試去訪問運行于模擬用戶環境中的其它線程上的連接。 無論是哪種情況,Windows NT 都會檢測有沒有誰試圖使用某個已
在其它用戶環境中打開的網絡命名管道句柄,并根據安全規則關閉該管道。 在 SQL Server 網絡監視器看來,這是
Windows NT 發出的關閉命名管道的請求,從而引起 Web 瀏覽器出錯。
錯誤消息
Microsoft OLE DB Provider for ODBC Drivers error '80004005' [Microsoft][ODBC SQL Server Driver][DBMSSOCN]
General network error. Check your network document
原因
這一錯誤可能發生在 SQL 服務器被重命名的情況下。 由于無法找到計算機名,引用舊名稱的 DSN 將會失敗。
錯誤消息
Microsoft OLE DB Provider for ODBC Drivers error '80040e21' Errors occurred
原因
這一錯誤可能是由于試圖向一個字段插入過多的數據,超過允許值而引起。 比如,一個 Microsoft Access 字段格式設置
為只接受 25 個字符,而試圖插入 26 個字符。
錯誤消息
Microsoft OLE DB Provider for ODBC Drivers error '80040e14' [Microsoft][ODBC Microsoft Access 97 Driver]
Syntax error in INSERT INTO statement.
原因
某個列名可能是保留字,如 DATE。 請將列名稱改為一個非保留字,如 SaleDate。
錯誤消息
Microsoft OLE DB Provider for ODBC Drivers error '80040e10' [Microsoft][ODBC Microsoft Access 97 Driver]
Too few parameters. Expected 1.
原因
查詢語法中所使用的列名不存在。 往往,這只是個打字錯誤。 請對照數據庫中的列名,檢查查詢字符串中的列名。 如果
使用的是 Microsoft Access,要確保使用的是實際列名,而不是列的“顯示”名。


參考
如要啟用 Visual InterDev 的遠程工作站工作方式,請按照以下 Microsoft Knowledge Base 文章所述,以建立系統
DSN:

Q178215 HOWTO: 配置 VID 以用于身份驗證 Web 工程
Q174943 PRB: 80004005“Couldn't Use '(unknown)';File Already in Use”

Q173742 BUG: 限制 Web 訪問時,Global.asa 不被執行

Q172864 ASP 頁面無法訪問會話及應用程序對象

Q156526 連接 Access 數據源時的一般錯誤 =51

Q175671 PRB: 訪問時的 SQL80004005 ConnectionOpen (CreateFile()) 錯誤

Q149425 IDC: 執行查詢錯誤,沒有定義為有效用戶

Q167452 PRB: 使用 Access 數據源時的‘Not a valid path’錯誤

Q125767 PRB: 執行 SQL 查詢后的查詢過于復雜錯誤

Q166659 PRB: 第二次嘗試時訪問 SQL 數據庫失敗

Q166029 PRB: 使用 Access 時,無法打開不明文件

Q178215 HOWTO: 配置 VID 以用于身份驗證 Web 工程

北斗有巢氏 有巢氏北斗