直播中
Microsoft Data Access Components versions 1.5, 2.0, 2.1, 2.5
Active Server Pages
Microsoft Visual InterDev, version 1.0
--------------------------------------------------------------------------------
概要
本文詳細(xì)講述了 Microsoft 數(shù)據(jù)訪問(wèn)組件 (MDAC) 收到 0x800040005 錯(cuò)誤的一些常見(jiàn)原因,MDAC 包括 ActiveX 數(shù)據(jù)對(duì)
象、OLE DB 和遠(yuǎn)程數(shù)據(jù)服務(wù) (RDS)。 同時(shí),本文還討論了其它一些錯(cuò)誤消息,包括 80040e21、80040e14 和
80040e10。
更多信息
80004005 錯(cuò)誤消息可歸納為:“出于某種原因,我無(wú)法訪問(wèn)您的數(shù)據(jù)”。 本文給出了各種 80004005 錯(cuò)誤消息的列表、
其中列舉了這些錯(cuò)誤消息的最常見(jiàn)起因及其疑難解答步驟。 雖然本文假定您是在 Active Server Page (ASP) 頁(yè)面
(.asp) 中使用 ActiveX 數(shù)據(jù)對(duì)象 (ADO),但這些起因和很多疑難解答步驟同樣適用于任何其它通過(guò) ODBC 訪問(wèn)數(shù)據(jù)的環(huán)
境。
錯(cuò)誤消息列表
這一節(jié)我們介紹了各種錯(cuò)誤消息的文本,以及導(dǎo)致錯(cuò)誤的原因。
錯(cuò)誤消息
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.
原因
該錯(cuò)誤的發(fā)生,通常是因?yàn)?Internet Information Server (IIS) 所使用的帳戶(hù)(通常是 IUSR)沒(méi)有正確的 Windows
NT 權(quán)限,因而無(wú)法訪問(wèn)基于文件的數(shù)據(jù)庫(kù)或包含文件的文件夾。
請(qǐng)檢查這些文件和文件夾的權(quán)限設(shè)置。 確認(rèn)您能夠創(chuàng)建和/或刪除任何臨時(shí)文件。 臨時(shí)文件一般都創(chuàng)建在與數(shù)據(jù)庫(kù)相同的
文件夾下,但也可以創(chuàng)建在其它文件夾下,如 /Winnt。
您可以使用 Windows NT 文件監(jiān)視器來(lái)檢查訪問(wèn)文件失敗的原因。 Windows NT 文件監(jiān)視器可從以下 Web 站點(diǎn)上得到:
http://www.sysinternals.com 。
如果您使用的是該數(shù)據(jù)庫(kù)的網(wǎng)絡(luò)路徑(UNC 或映像驅(qū)動(dòng)器),請(qǐng)檢查共享、文件及文件夾上的權(quán)限。
確認(rèn)文件及數(shù)據(jù)源名 (DSN) 沒(méi)有被標(biāo)記為獨(dú)占方式。
簡(jiǎn)化。 使用一個(gè)使用本地驅(qū)動(dòng)器號(hào)的系統(tǒng) DSN。 如有必要,把數(shù)據(jù)庫(kù)移至本地驅(qū)動(dòng)器,然后對(duì)其進(jìn)行測(cè)試。
錯(cuò)誤消息中的 other user(其它用戶(hù))有可能是 Visual InterDev。 請(qǐng)關(guān)閉任何包含該數(shù)據(jù)庫(kù)數(shù)據(jù)連接的 Visual
InterDev 工程。
錯(cuò)誤也可能是由委派問(wèn)題引起的。 檢查可能存在的任何身份驗(yàn)證方法(“基本”而不是 NTLM)。 如果連接字符串使用的
是統(tǒng)一命名約定 (UNC),請(qǐng)嘗試使用“基本身份驗(yàn)證”或一個(gè)絕對(duì)路徑,如 C:\Mydata\Data.mdb。即使 UNC 指向的資源
位于本地 IIS 計(jì)算機(jī),前述錯(cuò)誤也有可能發(fā)生。
當(dāng)訪問(wèn)鏈接到某個(gè)表的 Microsoft Access 數(shù)據(jù)庫(kù)時(shí),如果這一表處在網(wǎng)絡(luò)服務(wù)器上的 Access 數(shù)據(jù)庫(kù)中,這一錯(cuò)誤也有
可能發(fā)生。 這種情況下,請(qǐng)參見(jiàn)以下 Microsoft Knowledge Base 文章以找到可行的解決方法:
Q189408 PRB: ASP 無(wú)法訪問(wèn) IIS 4.0 下的網(wǎng)絡(luò)文件
錯(cuò)誤消息
Microsoft OLE DB Provider for ODBC Drivers error '80004005' [Microsoft][ODBC Microsoft Access 97 Driver]
Couldn't use '(unknown)'; file already in use.
原因
數(shù)據(jù)庫(kù)無(wú)法正確地為多個(gè)用戶(hù)鎖定。 詳細(xì)信息請(qǐng)參見(jiàn)以下 Microsoft Knowledge Base 文章:
Q174943 PRB: 80004005“Couldn't Use '(unknown)';File Already in Use”
錯(cuò)誤消息
Microsoft OLE DB Provider for ODBC Drivers error '80004005' [Microsoft][ODBC Driver Manager] Data source
name not found and no default driver specified.
原因
最常見(jiàn)的原因是因?yàn)?Global.asa 和 Global.asa 中初始化的連接字符串會(huì)話(huà)變量沒(méi)有激發(fā)。 您可以通過(guò)在 .asp 頁(yè)面中
加入以下代碼,來(lái)檢查該變量有沒(méi)有正確地初始化:
<%= "'auth_user' is " & request.servervariables("auth_user")%>
<P>
<%= "'auth_type' is " & request.servervariables("auth_type")%>
<P>
<%= "connection string is " & session("your_connectionstring")%>
<P>
另一個(gè)常見(jiàn)原因是因?yàn)樗褂玫倪B接字符串中有太多的空格。
DSN = MyDSN; Database = Pubs;
嘗試使用下面的語(yǔ)法代替:
DSN=MyDSN;Database=Pubs;
如果 Global.asa 文件沒(méi)有激發(fā),請(qǐng)檢查并確認(rèn)它是在 IIS 4.0 的應(yīng)用程序根下,(如果運(yùn)行的是 IIS 3.0,則應(yīng)在虛擬
根下,并且 Execute 復(fù)選框已經(jīng)選中)。 此外,當(dāng) Windows NT 權(quán)限限制了對(duì)文件夾的訪問(wèn)時(shí),程序設(shè)計(jì)中的一個(gè)錯(cuò)誤
也可能會(huì)妨礙 Global.asa 文件被激發(fā)。詳細(xì)信息請(qǐng)參見(jiàn) Microsoft Knowledge Base 文章: Q173742 “BUG: 限制
Web 訪問(wèn)時(shí),Global.asa 不被執(zhí)行”
無(wú)法找到 DSN 名。 請(qǐng)檢查并確認(rèn)沒(méi)有使用“用戶(hù)”類(lèi)型的 DSN。
如果使用的是文件 DSN 或系統(tǒng) DSN,則嘗試把連接字符串相應(yīng)地改為 DSN=MySystemDSN 或 DBQ=MyFileDSN。 簡(jiǎn)化!
檢查并確認(rèn)安裝了最新的驅(qū)動(dòng)程序。 如有您不能肯定,請(qǐng)從以下 Web 站點(diǎn)下載最新的 MDAC(Microsoft 數(shù)據(jù)訪問(wèn)組
件):
http://www.microsoft.com/data/
錯(cuò)誤消息
Microsoft OLE DB Provider for ODBC Drivers error '80004005' [Microsoft][ODBC Driver Manager] Data source
name not ??
原因
這個(gè)問(wèn)題看起來(lái)與計(jì)算機(jī)上軟件安裝或卸載的順序有關(guān)。 如果 ODBC 內(nèi)核文件不同步(它們必須為同一版本),就可能出
現(xiàn)這種錯(cuò)誤。
請(qǐng)從以下 Web 站點(diǎn)下載最新版的 MDAC(Microsoft 數(shù)據(jù)訪問(wèn)組件),以升級(jí)所有的 ODBC 核心驅(qū)動(dòng)程序:
http://www.microsoft.com/data/
錯(cuò)誤消息
Microsoft OLE DB Provider for ODBC Drivers error '80004005' [Microsoft][ODBC Access 97 ODBC driver Driver]
General error Unable to open registry key 'DriverId'.
原因
這一錯(cuò)誤是由從注冊(cè)表中讀取數(shù)值時(shí)引起的。 請(qǐng)用注冊(cè)表編輯器 (Regedt32.exe) 檢查注冊(cè)表項(xiàng)上設(shè)置的權(quán)限。 您也可
以用 Windows NT 注冊(cè)表監(jiān)視器 (NTRegMon) 來(lái)檢查注冊(cè)表讀取失敗。 NTRegMon 可從以下 Web 站點(diǎn)下載:
http://www.sysinternals.com
錯(cuò)誤消息
Microsoft OLE DB Provider for ODBC Drivers error '80004005' [Microsoft][ODBC SQL Server Driver][dbnmpntw]
ConnectionOpen (CreateFile()).
原因
這一錯(cuò)誤有兩種原因。 它們都與權(quán)限有關(guān),或者數(shù)據(jù)庫(kù)與 Web 服務(wù)器不在一臺(tái)計(jì)算機(jī)上,或者數(shù)據(jù)庫(kù)正通過(guò) UNC 路徑
(\\Server\Share) 被引用。 即使數(shù)據(jù)庫(kù)與 Web 服務(wù)器位于同一臺(tái)計(jì)算機(jī)上,UNC 路徑也使 Web 服務(wù)器認(rèn)為數(shù)據(jù)庫(kù)好象
位于網(wǎng)絡(luò)上的另一臺(tái)計(jì)算機(jī)上。
如果 .asp 頁(yè)面正被匿名用戶(hù)所訪問(wèn),就會(huì)發(fā)生以下情況:
IIS 將使用(默認(rèn))Windows NT 帳戶(hù):
USR_<machinename
>。
因?yàn)樵搸?hù)是 Web 服務(wù)器的本地賬戶(hù),所以網(wǎng)絡(luò)上的其它計(jì)算機(jī)根本無(wú)從得知該帳戶(hù)。 當(dāng) IIS(在 IUSR 帳戶(hù)的安全環(huán)
境下運(yùn)行)試圖訪問(wèn)遠(yuǎn)程計(jì)算機(jī)上的任何資源時(shí),遠(yuǎn)程計(jì)算機(jī)將驗(yàn)證其使用的帳戶(hù)。 由于 IUSR 帳戶(hù)是本地帳戶(hù),因此對(duì)
于遠(yuǎn)程計(jì)算機(jī)來(lái)說(shuō),它是無(wú)從得知的,所以訪問(wèn)被拒絕。
當(dāng)匿名訪問(wèn)引發(fā)這個(gè)問(wèn)題時(shí),有兩個(gè)解決辦法:
在“Internet 服務(wù)管理器”工具中,從 Web 屬性下將匿名登錄帳戶(hù)從默認(rèn)的本地帳戶(hù)改為一個(gè)基于域的有效帳戶(hù)。 在用
戶(hù)名字段中,輸入要使用的域帳戶(hù),格式為 domain\userid。 這樣,遠(yuǎn)程計(jì)算機(jī)就能用域控制器來(lái)驗(yàn)證 IIS 傳遞給它的
安全憑據(jù)。
-或者-
在包含您想要訪問(wèn)的資源的遠(yuǎn)程計(jì)算機(jī)上復(fù)制的帳戶(hù)
IUSR_<machineaccount
>
。 如果帳戶(hù)是在遠(yuǎn)程計(jì)算機(jī)上創(chuàng)建的,包含完全相同的名稱(chēng)和密碼,Windows NT 把它們視為等價(jià)帳戶(hù)。
-或者-
如果 .asp 頁(yè)面只允許經(jīng)身份驗(yàn)證的訪問(wèn),請(qǐng)參考以下內(nèi)容:
如果頁(yè)面不允許匿名訪問(wèn),IIS 將會(huì)試圖驗(yàn)證作出請(qǐng)求的用戶(hù)的身份,并使用其安全憑據(jù)控制其所有活動(dòng),如訪問(wèn)數(shù)據(jù)庫(kù)
的活動(dòng)。 下面對(duì)這種情形下失敗的兩個(gè)主要原因做了說(shuō)明。
默認(rèn)情況下,IIS 被配置為以 Windows NT Challenge/Response 作為其身份驗(yàn)證方法。 由于 Windows NT 4.0(及更早版
本)安全模型的限制,經(jīng)過(guò) Windows NT Challenge/Response 身份驗(yàn)證的用戶(hù)也無(wú)法訪問(wèn)遠(yuǎn)程計(jì)算機(jī)上的資源。 這通常
稱(chēng)為委派問(wèn)題。 要驗(yàn)證是不是這種情況,可在“Internet 服務(wù)管理器”工具中,從 Web 屬性下選擇基本(明文)復(fù)選
框,然后清除 Windows NT Challenge/Response。 如果這一步驟解決了問(wèn)題,很明顯這是一個(gè)委派問(wèn)題。
-或者-
如果問(wèn)題仍舊存在,可能是所使用的用戶(hù)帳戶(hù)沒(méi)有正確的 SQL Windows NT 計(jì)算機(jī)權(quán)限。 不妨嘗試使用一個(gè)明確擁有該
SQL 計(jì)算機(jī)訪問(wèn)權(quán)限的帳戶(hù)。
有關(guān)委派、IIS 如何通過(guò)身份驗(yàn)證來(lái)保護(hù) Web 站點(diǎn),以及相關(guān)問(wèn)題的詳細(xì)信息,請(qǐng)參見(jiàn)文章“IIS Authentication and
Security for Internet Developers”,它位于以下 Web 站點(diǎn):
http://www.microsoft.com/workshop/server/feature/security.asp
錯(cuò)誤消息
Microsoft OLE DB Provider for ODBC Drivers error '80004005' Microsoft][ODBC Microsoft SQL Driver] Logon
Failed()
原因
該錯(cuò)誤是在 SQL 服務(wù)器不接受或不認(rèn)可所提交的登錄帳戶(hù)及/或密碼(使用標(biāo)準(zhǔn)安全性時(shí)),或者沒(méi)有任何 Windows NT
帳戶(hù)映射到 SQL 帳戶(hù)(使用集成安全性時(shí))時(shí),由 SQL 服務(wù)器生成的。
如果使用的是標(biāo)準(zhǔn)安全性,說(shuō)明 SQL 帳戶(hù)名和密碼不正確。 請(qǐng)嘗試使用系統(tǒng)管理員帳戶(hù)和密碼(UID= "SA",密碼為
空)。 這些必須在連接字符串行中定義, 因?yàn)?DSN 不存儲(chǔ)用戶(hù)名和密碼。
如果使用的是集成安全性,則檢查調(diào)用頁(yè)面的 Windows NT 帳戶(hù),找出它所映射的目標(biāo)帳戶(hù)。
SQL 不允許 SQL 帳戶(hù)名中有下劃線。 如果某人把 Windows NT 帳戶(hù) IUSR_machinename 手動(dòng)映射到一個(gè)同名的 SQL 帳
戶(hù),就會(huì)失敗。 請(qǐng)把所有包含下劃線的帳戶(hù)都映射為 SQL 中不包含下劃線的帳戶(hù)名。
錯(cuò)誤消息
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(企業(yè)管理器)中打開(kāi)了集成安全性,而所使用的 Windows NT 帳戶(hù)未被映射到 SQL 帳戶(hù)。
請(qǐng)嘗試把 SQL 改用標(biāo)準(zhǔn)安全性(在 Enterprise Manager 中,選擇 Server/SQL Server/Configure/Security
Options/Standard。
如果您是在 IIS 4.0 下運(yùn)行,則取消選擇該工程的密碼同步。
錯(cuò)誤消息
Microsoft OLE DB Provider for ODBC Drivers error '80004005' [Microsoft][ODBC Microsoft Access 97 Driver]
Couldn't lock file.
原因
這一錯(cuò)誤可能是由于沒(méi)有正確的權(quán)限為 Microsoft Access 數(shù)據(jù)庫(kù)創(chuàng)建鎖定文件 (.ldb) 而引起的。 默認(rèn)情況下,鎖定文
件與 Microsoft Access .mdb 文件創(chuàng)建在同一文件夾下。
請(qǐng)嘗試賦予訪問(wèn)數(shù)據(jù)庫(kù)(通常是 IUSR_machinename)的用戶(hù)以共享/文件夾的完全控制權(quán)限。
有時(shí),共享文件夾權(quán)限被設(shè)置為只讀。 您也可以嘗試更改連接模式,這時(shí)可以使用以下示例代碼:
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
錯(cuò)誤消息
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 服務(wù)器所讀取的路徑是無(wú)效路徑。 當(dāng) Global.asa 文件正被使用,而連接字符串是 Web 服務(wù)器之外的另一臺(tái)計(jì)算機(jī)
上創(chuàng)建的時(shí)候,最容易發(fā)生這種錯(cuò)誤。 如果路徑是一個(gè)映像驅(qū)動(dòng)器號(hào),它可能只對(duì)創(chuàng)建連接字符串的客戶(hù)計(jì)算機(jī)有效。
錯(cuò)誤消息
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.
原因
查詢(xún)過(guò)于復(fù)雜。 在查詢(xún)中有過(guò)多的限制。
錯(cuò)誤消息
Microsoft OLE DB Provider for ODBC Drivers error '80004005' [Microsoft][ODBC SQL Server Driver][DBNMPNTW]
ConnectionWrite (GetOverLappedResult()).
原因
“允許匿名用戶(hù)”環(huán)境被關(guān)閉時(shí),Windows NT 在第一個(gè)請(qǐng)求完成后要關(guān)閉與 SQL Server 連接的管道。 這是因?yàn)?,第?BR>個(gè)到 SQL Server 的連接是在 IIS 匿名用戶(hù)帳戶(hù)中建立的。 然后,IIS 或者選擇在同一線程上模擬瀏覽器客戶(hù),或者嘗
試去訪問(wèn)運(yùn)行于模擬用戶(hù)環(huán)境中的其它線程上的連接。 無(wú)論是哪種情況,Windows NT 都會(huì)檢測(cè)有沒(méi)有誰(shuí)試圖使用某個(gè)已
在其它用戶(hù)環(huán)境中打開(kāi)的網(wǎng)絡(luò)命名管道句柄,并根據(jù)安全規(guī)則關(guān)閉該管道。 在 SQL Server 網(wǎng)絡(luò)監(jiān)視器看來(lái),這是
Windows NT 發(fā)出的關(guān)閉命名管道的請(qǐng)求,從而引起 Web 瀏覽器出錯(cuò)。
錯(cuò)誤消息
Microsoft OLE DB Provider for ODBC Drivers error '80004005' [Microsoft][ODBC SQL Server Driver][DBMSSOCN]
General network error. Check your network document
原因
這一錯(cuò)誤可能發(fā)生在 SQL 服務(wù)器被重命名的情況下。 由于無(wú)法找到計(jì)算機(jī)名,引用舊名稱(chēng)的 DSN 將會(huì)失敗。
錯(cuò)誤消息
Microsoft OLE DB Provider for ODBC Drivers error '80040e21' Errors occurred
原因
這一錯(cuò)誤可能是由于試圖向一個(gè)字段插入過(guò)多的數(shù)據(jù),超過(guò)允許值而引起。 比如,一個(gè) Microsoft Access 字段格式設(shè)置
為只接受 25 個(gè)字符,而試圖插入 26 個(gè)字符。
錯(cuò)誤消息
Microsoft OLE DB Provider for ODBC Drivers error '80040e14' [Microsoft][ODBC Microsoft Access 97 Driver]
Syntax error in INSERT INTO statement.
原因
某個(gè)列名可能是保留字,如 DATE。 請(qǐng)將列名稱(chēng)改為一個(gè)非保留字,如 SaleDate。
錯(cuò)誤消息
Microsoft OLE DB Provider for ODBC Drivers error '80040e10' [Microsoft][ODBC Microsoft Access 97 Driver]
Too few parameters. Expected 1.
原因
查詢(xún)語(yǔ)法中所使用的列名不存在。 往往,這只是個(gè)打字錯(cuò)誤。 請(qǐng)對(duì)照數(shù)據(jù)庫(kù)中的列名,檢查查詢(xún)字符串中的列名。 如果
使用的是 Microsoft Access,要確保使用的是實(shí)際列名,而不是列的“顯示”名。
參考
如要啟用 Visual InterDev 的遠(yuǎn)程工作站工作方式,請(qǐng)按照以下 Microsoft Knowledge Base 文章所述,以建立系統(tǒng)
DSN:
Q178215 HOWTO: 配置 VID 以用于身份驗(yàn)證 Web 工程
Q174943 PRB: 80004005“Couldn't Use '(unknown)';File Already in Use”
Q173742 BUG: 限制 Web 訪問(wèn)時(shí),Global.asa 不被執(zhí)行
Q172864 ASP 頁(yè)面無(wú)法訪問(wèn)會(huì)話(huà)及應(yīng)用程序?qū)ο?
Q156526 連接 Access 數(shù)據(jù)源時(shí)的一般錯(cuò)誤 =51
Q175671 PRB: 訪問(wèn)時(shí)的 SQL80004005 ConnectionOpen (CreateFile()) 錯(cuò)誤
Q149425 IDC: 執(zhí)行查詢(xún)錯(cuò)誤,沒(méi)有定義為有效用戶(hù)
Q167452 PRB: 使用 Access 數(shù)據(jù)源時(shí)的‘Not a valid path’錯(cuò)誤
Q125767 PRB: 執(zhí)行 SQL 查詢(xún)后的查詢(xún)過(guò)于復(fù)雜錯(cuò)誤
Q166659 PRB: 第二次嘗試時(shí)訪問(wèn) SQL 數(shù)據(jù)庫(kù)失敗
Q166029 PRB: 使用 Access 時(shí),無(wú)法打開(kāi)不明文件
Q178215 HOWTO: 配置 VID 以用于身份驗(yàn)證 Web 工程