文章中的信息适用于:
MicrosoftDataAccessComponentsversions1.5,2.0,2.1,2.5
ActiveServerPages
MicrosoftVisualInterDev,version1.0
----------------------------------------------------------------------------
概要
本文详细讲述了Microsoft数据访问组件(MDAC)收到0x800040005错误的一些常见原因,MDAC包括ActiveX数据对象、OLEDB和远程数据服务(RDS)。同时,本文还讨论了其它一些错误消息,包括80040e21、80040e14和80040e10。
更多信息
80004005错误消息可归纳为:“出于某种原因,我无法访问您的数据”。本文给出了各种80004005错误消息的列表、其中列举了这些错误消息的最常见起因及其疑难解答步骤。虽然本文假定您是在ActiveServerPage(ASP)页面(.asp)中使用ActiveX数据对象(ADO),但这些起因和很多疑难解答步骤同样适用于任何其它通过ODBC访问数据的环境。
错误消息列表
这一节我们介绍了各种错误消息的文本,以及导致错误的原因。
错误消息
MicrosoftOLEDBProviderforODBCDriverserror'80004005'[Microsoft][ODBCMicrosoftAccess97Driver]
TheMicrosoftJetdatabaseenginecannotopenthefile'(unknown)'.Itisalreadyopenedexclusivelybyanotheruser,oryouneedpermissiontoviewitsdata.
原因
该错误的发生,通常是因为InternetInformationServer(IIS)所使用的帐户(通常是IUSR)没有正确的WindowsNT权限,因而无法访问基于文件的数据库或包含文件的文件夹。请检查这些文件和文件夹的权限设置。确认您能够创建和/或删除任何临时文件。临时
文件一般都创建在与数据库相同的文件夹下,但也可以创建在其它文件夹下,如/Winnt。您可以使用WindowsNT文件监视器来检查访问文件失败的原因。WindowsNT文件监视器可从以下Web站点上得到:
http://www.sysinternals.com。
如果您使用的是该数据库的网络路径(UNC或映像驱动器),请检查共享、文件及文件夹上的权限。确认文件及数据源名(DSN)没有被标记为独占方式。使用一个使用本地驱动器号的系统DSN。如有必要,把数据库移至本地驱动器,然后对其进行测试。错误消息中的otheruser(其它用户)有可能是VisualInterDev。请关闭任何包含该数据库数据连接的VisualInterDev工程。
错误也可能是由委派问题引起的。检查可能存在的任何身份验证方法(“基本”而不是NTLM)。如果连接字符串使用的是统一命名约定(UNC),请尝试使用“基本身份验证”或一个绝对路径,如C:MydataData.mdb。即使UNC指向的资源位于本地IIS计算机,前述错误也有可能发生。
当访问链接到某个表的MicrosoftAccess数据库时,如果这一表处在网络服务器上的Access数据库中,这一错误也有可能发生。这种情况下,请参见以下MicrosoftKnowledgeBase文章以找到可行的解决方法:
Q189408PRB:ASP无法访问IIS4.0下的网络文件
错误消息MicrosoftOLEDBProviderforODBCDriverserror'80004005'[Microsoft][ODBCMicrosoftAccess97Driver]Couldn'tuse'(unknown)';filealreadyinuse.
原因
数据库无法正确地为多个用户锁定。详细信息请参见以下MicrosoftKnowledgeBase文章:
Q174943PRB:80004005“Couldn'tUse'(unknown)';FileAlreadyinUse”
错误消息
MicrosoftOLEDBProviderforODBCDriverserror'80004005'[Microsoft][ODBCDriverManager]Datasourcenamenotfoundandnodefaultdriverspecified.
原因
最常见的原因是因为Global.asa和Global.asa中初始化的连接字符串会话变量没有激发。您可以通过在.asp页面中加入以下代码,来检查该变量有没有正确地初始化:
另一个常见原因是因为所使用的连接字符串中有太多的空格。
DSN=MyDSN;Database=Pubs;
尝试使用下面的语法代替:
DSN=MyDSN;Database=Pubs;
如果Global.asa文件没有激发,请检查并确认它是在IIS4.0的应用程序根下,(如果运行的是IIS3.0,则应在虚拟根下,并且Execute复选框已经选中)。此外,当WindowsNT权限限制了对文件夹的访问时,程序设计中的一个错误也可能会妨碍Global.asa文件被激发。详细信息请参见MicrosoftKnowledgeBase
文章:
Q173742“BUG:限制Web访问时,Global.asa不被执行”无法找到DSN名。
请检查并确认没有使用“用户”类型的DSN。
如果使用的是文件DSN或系统DSN,则尝试把连接字符串相应地改为DSN=MySystemDSN或DBQ=MyFileDSN。简化!
检查并确认安装了最新的驱动程序。如有您不能肯定,请从以下Web站点下载最新的MDAC(Microsoft数据访问组件):
http://www.microsoft.com/data/
错误消息
MicrosoftOLEDBProviderforODBCDriverserror'80004005'[Microsoft][ODBC
DriverManager]Datasourcenamenot??
原因
这个问题看起来与计算机上软件安装或卸载的顺序有关。如果ODBC内核文件不同步(它们必须为同一版本),就可能出现这种错误。
请从以下Web站点下载最新版的MDAC(Microsoft数据访问组件),以升级所有的ODBC核心驱动程序:
http://www.microsoft.com/data/
错误消息
MicrosoftOLEDBProviderforODBCDriverserror'80004005'[Microsoft][ODBCAccess97ODBCdriverDriver]
GeneralerrorUnabletoopenregistrykey'DriverId'.
原因
这一错误是由从注册表中读取数值时引起的。请用注册表编辑器(Regedt32.exe)检查注册表项上设置的权限。您也可以用WindowsNT注册表监视器(NTRegMon)来检查注册表读取失败。NTRegMon可从
以下Web站点下载:
http://www.sysinternals.com
错误消息
MicrosoftOLEDBProviderforODBCDriverserror'80004005'[Microsoft][ODBCSQLServerDriver][dbnmpntw]ConnectionOpen(CreateFile()).
原因
这一错误有两种原因。它们都与权限有关,或者数据库与Web服务器不在一台计算机上,或者数据库正通过UNC路径(ServerShare)被引用。即使数据库与Web服务器位于同一台计算机上,UNC路径也使Web服务器认为数据库好象位于网络上的另一台计算机上。
如果.asp页面正被匿名用户所访问,就会发生以下情况:
IIS将使用(默认)WindowsNT帐户:
USR_。
因为该帐户是Web服务器的本地账户,所以网络上的其它计算机根本无从得知该帐户。当IIS(在IUSR帐户的安全环境下运行)试图访问远程计算机上的任何资源时,远程计算机将验证其使用的帐户。由于IUSR帐户是本地帐户,因此对于远程计算机来说,它是无从得知的,所以访问被拒绝。
当匿名访问引发这个问题时,有两个解决办法:
在“Internet服务管理器”工具中,从Web属性下将匿名登录帐户从默认的本地帐户改为一个基于域的有效帐户。在用户名字段中,输入要使用的域帐户,格式为domainuserid。这样,远程计算机就能用域控制器来验证IIS传递给它的安全凭据。
-或者-
在包含您想要访问的资源的远程计算机上复制的帐户
IUSR_。如果帐户是在远程计算机上创建的,包含完全相同的名称和密码,WindowsNT把它
们视为等价帐户。
-或者-
如果.asp页面只允许经身份验证的访问,请参考以下内容:
如果页面不允许匿名访问,IIS将会试图验证作出请求的用户的身份,并使用其安全凭据控制其所有活动,如访问数据库的活动。下面对这种情形下失败的两个主要原因做了说明。
默认情况下,IIS被配置为以WindowsNTChallenge/Response作为其身份验证方法。
由于WindowsNT4.0(及更早版本)安全模型的限制,经过WindowsNTChallenge/Response身份验证的用户也无法访问远程计算机上的资源。这通常
称为委派问题。要验证是不是这种情况,可在“Internet服务管理器”工具中,从Web属性下选择基本(明文)复选框,然后清除WindowsNTChallenge/Response。如果这一步骤解决了问题,很明显这是一个委派问题。
-或者-
如果问题仍旧存在,可能是所使用的用户帐户没有正确的SQLWindowsNT计算机权限。不妨尝试使用一个明确拥有该SQL计算机访问权限的帐户。
有关委派、IIS如何通过身份验证来保护Web站点,以及相关问题的详细信息,请参见文章“IISAuthenticationand
SecurityforInternetDevelopers”,
它位于以下Web站点:
http://www.microsoft.com/workshop/s...re/security.asp
错误消息
MicrosoftOLEDBProviderforODBCDriverserror'80004005'Microsoft][ODBCMicrosoftSQLDriver]LogonFailed()
原因
该错误是在SQL服务器不接受或不认可所提交的登录帐户及/或密码(使用标准安全性时),或者没有任何WindowsNT帐户映射到SQL帐户(使用集成安全性时)时,由SQL服务器生成的。
如果使用的是标准安全性,说明SQL帐户名和密码不正确。请尝试使用系统管理员帐户和密码(UID="SA",密码为空)。这些必须在连接字符串行中定义,因为DSN不存储用户名和密码。
如果使用的是集成安全性,则检查调用页面的WindowsNT帐户,找出它所映射的目标帐户。
SQL不允许SQL帐户名中有下划线。如果某人把WindowsNT帐户IUSR_machinename手动映射到一个同名的SQL帐户,就会失败。请把所有包含下划线的帐户都映射为SQL中不包含下划线的帐户名。
错误消息
MicrosoftOLEDBProviderforODBCDriverserror'80004005'[Microsoft][ODBCSQLServerDriver][SQLServer]Loginfailed-User:Reason:Notdefinedasavaliduserofatrusted
SQLServerconnection.
原因
SQLEnterpriseManager(企业管理器)中打开了集成安全性,而所使用的WindowsNT帐户未被映射到SQL帐户。
请尝试把SQL改用标准安全性(在EnterpriseManager中,选择Server/SQLServer/Configure/SecurityOptions/Standard。
如果您是在IIS4.0下运行,则取消选择该工程的密码同步。
错误消息
MicrosoftOLEDBProviderforODBCDriverserror'80004005'[Microsoft][ODBCMicrosoftAccess97Driver]Couldn'tlockfile.
原因
这一错误可能是由于没有正确的权限为MicrosoftAccess数据库创建锁定文件(.ldb)而引起的。默认情况下,锁定文件与MicrosoftAccess.mdb文件创建在同一文件夹下。
请尝试赋予访问数据库(通常是IUSR_machinename)的用户以共享/文件夹的完全控制权限。
有时,共享文件夹权限被设置为只读。您也可以尝试更改连接模式,这时可以使用以下示例代码:
SetConn=Server.CreateObject("ADODB.Connection")
Conn.Mode=adModeShareDenyWrite'8
'FromAdovbs.inc
'----ConnectModeEnumvalues----
'ConstadModeUnknown=0
'ConstadModeRead=1
'ConstadModeWrite=2
'ConstadModeReadWrite=3
'ConstadModeShareDenyRead=4
'ConstadModeShareDenyWrite=8
'ConstadModeShareExclusive=&Hc
'ConstadModeShareDenyNone=&H10
错误消息
MicrosoftOLEDBProviderforODBCDriverserror'80004005'[Microsoft][ODBCMicrosoftAccess97Driver]'(unknown)'isn'tavalidpath.Makesurethatthepathnameisspel
ledcorrectlyandthatyouareconnectedtotheserveronwhichthefileresides.
原因
Web服务器所读取的路径是无效路径。当Global.asa文件正被使用,而连接字符串是Web服务器之外的另一台计算机上创建的时候,最容易发生这种错误。如果路径是一个映像驱动器号,它可能只对创建连接字符串的客户计算机有效。
错误消息
MicrosoftOLEDBProviderforODBCDriverserror'80004005'[Microsoft][ODBCSQLServerDriver][SQLServer]Thequeryandtheviewsinitexceedthelimitof16tables.
原因
查询过于复杂。在查询中有过多的限制。
错误消息
MicrosoftOLEDBProviderforODBCDriverserror'80004005'[Microsoft][ODBCSQLServer
DRIVER][DBNMPNTW]CONNECTIONWRITE(GETOVERLAPPEDRESULT()).
原因
“允许匿名用户”环境被关闭时,WINDOWSNT在第一个请求完成后要关闭与SQLSERVER连接的管道。这是因为,第一个到SQLSERVER的连接是在IIS匿名用户帐户中建立的。然后,IIS或者选择在同一线程上模拟浏览器客户,或者尝试去访问运行于模拟用户环境中的其它线程上的连接。无论是哪种情况,WINDOWSNT都会检测有没有谁试图使用某个已在其它用户环境中打开的网络命名管道句柄,并根据安全规则关闭该管道。在SQLSE
RVER网络监视器看来,这是WINDOWSNT发出的关闭命名管道的请求,从而引起WEB浏览器出错。
错误消息
MICROSOFTOLEDBPROVIDERFORODBCDRIVERSERROR'80004005'[MICROSOFT][ODBCSQLSERVERDRIVER][DBMSSOCN]GENERALNETWORKERROR.CHECKYOURNETWORKDOCUMENT
原因
这一错误可能发生在SQL服务器被重命名的情况下。由于无法找到计算机名,引用旧名称的DSN将会失败。
错误消息
MICROSOFTOLEDBPROVIDERFORODBCDRIVERSERROR'80040E21'ERRORSOCCURRED
原因
这一错误可能是由于试图向一个字段插入过多的数据,超过允许值而引起。比如,一个MICROSOFTACCESS字段格式设置为只接受25个字符,而试图插入26个字符。
错误消息
MICROSOFTOLEDBPROVIDERFORODBCDRIVERSERROR'80040E14'[MICROSOFT][ODBCMICROSOFTACCESS97DRIVER]
SYNTAXERRORININSERTINTOSTATEMENT.
原因
某个列名可能是保留字,如DATE。请将列名称改为一个非保留字,如SALEDATE。
错误消息
MICROSOFTOLEDBPROVIDERFORODBCDRIVERSERROR'80040E10'[MICROSOFT][ODBCMICROSOFTACCESS97DRIVER]
TOOFEWPARAMETERS.EXPECTED1.
原因
查询语法中所使用的列名不存在。往往,这只是个打字错误。请对照数据库中的列名,检查查询字符串中的列名。如果使用的是MICROSOFTACCESS,要确保使用的是实际列名,而不是列的“显示”名。
参考
如要启用VISUALINTERDEV的远程工作站工作方式,请按照以下MICROSOFTKNOWLEDGEBASE文章所述,以建立系统DSN:
Q178215HOWTO:配置VID以用于身份验证WEB工程
Q174943PRB:80004005“COULDN'TUSE'(UNKNOWN)';FILEALREADYINUSE”
Q173742BUG:限制WEB访问时,GLOBAL.ASA不被执行
Q172864ASP页面无法访问会话及应用程序对象
Q156526连接ACCESS数据源时的一般错误=51
Q175671PRB:访问时的SQL80004005CONNECTIONOPEN(CREATEFILE())错误
Q149425IDC:执行查询错误,没有定义为有效用户
Q167452PRB:使用ACCESS数据源时的‘NOTAVALIDPATH'错误
Q125767PRB:执行SQL查询后的查询过于复杂错误
Q166659PRB:第二次尝试时访问SQL数据库失败
Q166029PRB:使用ACCESS时,无法打开不明文件
Q178215HOWTO:配置VID以用于身份验证WEB工程