ASP访问ACCESS出错提示简要解释

80酷酷网    80kuku.com

  access|访问

问题:我在asp上挂上access数据库,发现它不支持Group by 或 Order by 子句,请问是何原因?
SELECT * FROM zyckb group by ckdwdm where cksj>cdate(1998/12/31)
Microsoft OLE DB Provider for ODBC Drivers 错误 80040e21
ODBC 驱动程序不支持需要的属性。

1 group子句只能用在Where子句后面。

2 直接使用 Microsoft.Jet.OLEDB.4.0 一层接口:
adoConnection.open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath ("/") & "xxx.mdb"
不要使用 Microsoft OLEDB Provider for ODBC Drivers + Microsoft Access Driver (*.mdb)(Access 的 ODBC Driver)两层接口:
adoConnection.open "PROVIDER=MSDASQL.1;Driver=Microsoft Access Driver(*.mdb);DBQ=" & Server.MapPath ("/") & xxx.mdb"

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 站点上得到:

如果您使用的是该数据库的网络路径(UNC 或映像驱动器),请检查共享、文件及文件夹上的权限。

确认文件及数据源名 (DSN) 没有被标记为独占方式。

简化。 使用一个使用本地驱动器号的系统 DSN。 如有必要,把数据库移至本地驱动器,然后对其进行测试。

错误消息中的 other user(其它用户)有可能是 Visual InterDev。 请关闭任何包含该数据库数据连接的 Visual
InterDev 工程。

错误也可能是由委派问题引起的。 检查可能存在的任何身份验证方法(“基本”而不是 NTLM)。 如果连接字符串使用的
是统一命名约定 (UNC),请尝试使用“基本身份验证”或一个绝对路径,如 C:\Mydata\Data.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]
Couldnt use (unknown); file already in use.
原因
数据库无法正确地为多个用户锁定。 详细信息请参见以下 Microsoft Knowledge Base 文章:
Q174943 PRB: 80004005“Couldnt 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 页面中
加入以下代码,来检查该变量有没有正确地初始化:

另一个常见原因是因为所使用的连接字符串中有太多的空格。
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 数据访问组
件):

错误消息
Microsoft OLE DB Provider for ODBC Drivers error 80004005 [Microsoft][ODBC Driver Manager] Data source
name not ??
原因
这个问题看起来与计算机上软件安装或卸载的顺序有关。 如果 ODBC 内核文件不同步(它们必须为同一版本),就可能出
现这种错误。

请从以下 Web 站点下载最新版的 MDAC(Microsoft 数据访问组件),以升级所有的 ODBC 核心驱动程序:

错误消息
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 站点下载:

错误消息
Microsoft OLE DB Provider for ODBC Drivers error 80004005 [Microsoft][ODBC SQL Server Driver][dbnmpntw]
ConnectionOpen (CreateFile()).
原因
这一错误有两种原因。 它们都与权限有关,或者数据库与 Web 服务器不在一台计算机上,或者数据库正通过 UNC 路径() 被引用。 即使数据库与 Web 服务器位于同一台计算机上,UNC 路径也使 Web 服务器认为数据库好象位于网络上的另一台计算机上。
如果 .asp 页面正被匿名用户所访问,就会发生以下情况:

IIS 将使用(默认)Windows NT 帐户: USR_>。

因为该帐户是 Web 服务器的本地账户,所以网络上的其它计算机根本无从得知该帐户。 当 IIS(在 IUSR 帐户的安全环
境下运行)试图访问远程计算机上的任何资源时,远程计算机将验证其使用的帐户。 由于 IUSR 帐户是本地帐户,因此对
于远程计算机来说,它是无从得知的,所以访问被拒绝。

当匿名访问引发这个问题时,有两个解决办法:

在“Internet 服务管理器”工具中,从 Web 属性下将匿名登录帐户从默认的本地帐户改为一个基于域的有效帐户。 在用
户名字段中,输入要使用的域帐户,格式为 domain\userid。 这样,远程计算机就能用域控制器来验证 IIS 传递给它的
安全凭据。

-或者-

在包含您想要访问的资源的远程计算机上复制的帐户 IUSR_>

。 如果帐户是在远程计算机上创建的,包含完全相同的名称和密码,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 站点:

错误消息
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]
Couldnt 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) isnt 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“Couldnt 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 工程

在Asp页面中向记录集取长text型数据时,出现如下错误现象时:

MicrosoftOLEDBProviderforODBCDrivers错误80040e21

Errorsoccurred

可有以下三种解决办法:

(一)使用rs.opensql,conn,1,3方式打开记录集

(二)将该列放在第一列取出,比如comment里存放有较长的text内容,取记录集内容的时候,先来个comment=rs("comment")把这个捣蛋的东西先取出来放到内存变量中,然后再操作其它的字段。由于一般长text内容不会在第一个显示,因此一般都要取出来放到内存变量中。

(三)改为oledb方式连接数据库。在此方式连接数据库时,不会出现该错误(起码我没有遇到过)。在我的系统中,将现在的oledb连接方式改成odbc连接方式后,错误就马上出现了。

此错误怀疑是由于Asp向odbc返回的记录集取数据的机制有些问题造成。建议采用第三种方法避免该错误。

提问:
那么以下错误类型是什么意思
Microsoft OLE DB Provider for ODBC Drivers 错误 80040e21

The request properties can not be supported by this ODBC Driver

数据库字段长度不够

出错信息
Microsoft OLE DB Provider for ODBC Drivers error 80040e21
The request properties can not be supported by this ODBC Driver.
//_ScriptLibrary/Recordset.ASP, line 466

原因
When the Recordset DTC has the cursor location property set to "2 - Use Server Side Cursors" (the default value), it cannot return multiple recordsets.
当the Recordset DTC的游标设为2(服务器端游标,默认值)时,无法返回多个记录集

RESOLUTION
Under the Properties dialog box for the Recordset DTC, go to the Advanced tab and change the cursor location from "2 - Use Server-Side Cursor" to "3 - Use Client-Side Cursor."

asp错误代码
错误代码错误消息和扩展信息
ASP0100 Out of memory(内存溢出)
ASP0101 Unexpected error(函数返回e x c e p t i o n _ n a m e )
ASP0102 Expecting string input(期待字符串输入)
ASP0103 Expecting numeric input(期待数字量输入)
ASP0104 Operating not allowed(操作不允许)
ASP0105 Index out of range(数组下标溢出)
ASP0106 Type Mismatch(数据类型不匹配)
ASP0107 Stack Overflow(处理的数据量超过了允许的范围)
ASP0115 Unexpected error(出现在外部对象中的可捕获的错误e x c e p t i o n _ n a m e,脚本不能继续运行)
ASP0177 S e r v e r.CreateObject Failed(无效的P r o g I D )
ASP0190 Unexpected error(当释放外部对象时,出现的可捕获的错误)
ASP0191 Unexpected error(在外部对象的O n S t a r t P a g e方法中出现的可捕获的错误)
ASP0192 Unexpected error(在外部对象的OnEndPage 方法中出现的可捕获的错误)
ASP0193 OnStartPage Failed(在外部对象的O n S t a r t P a g e方法中出现错误)
ASP0194 OnEndPage Failed(在外部对象的OnEndPage 方法中出现错误)
ASP0240 Script Engine Exception(脚本引擎从o b j e c t _ n a m e抛出异常e x c e p t i o n _ n a m e )
ASP0241 CreateObject Exception(object_name的C r e a t e O b j e c t方法所导致的异常e x c e p t i o n _ n a m e )
ASP0242 Query OnStartPage Interface Exception(查询对象o b j e c t _ n a m e的O n S t a r t P a g e或O n E n d P a g e
方法所导致的异常e x c e p t i o n _ n a m e )

------------------
ADO 错误代码

除了在 Error 对象和 Errors 集合中说明的提供者错误之外,ADO 本身也将错误返回到运行时环境的异常处理机制之中。使用编程语言的错误捕获机制(如 Microsoft? Visual Basic? 中的 On Error 语句)可捕获及处理下列错误。下表将同时显示十进制和十六进制错误代码值。

常量名称         编号       说明
adErrInvalidArgument   3001  0x800A0BB9
应用程序使用的参数其类型错误、超出可接受的范围或者与其他参数冲突。
adErrNoCurrentRecord   3021  0x800A0BCD
BOF 或 EOF 为 True,或者当前记录已经删除。应用程序请求的操作需要当前记录。
adErrIllegalOperation   3219 0x800A0C93
应用程序请求的操作不允许出现在该上下文中
adErrInTransaction 3246 0x800A0CAE
在事务中应用程序无法显式关闭 Connection 对象。
adErrFeatureNotAvailable 3251 0x800A0CB3
提供者不支持应用程序请求的操作。
adErrItemNotFound 3265 0x800A0CC1
ADO 无法在对应于应用程序请求的名称或顺序引用的集合中找到对象。
adErrObjectInCollection 3367 0x800A0D27
无法追加,对象已经在集合中。
adErrObjectNotSet 3420 0x800A0D5C
应用程序引用的对象不再指向有效的对象。
adErrDataConversion 3421 0x800A0D5D
应用程序使用了不符合对当前操作的值类型。
adErrObjectClosed 3704 0x800A0E78
如果对象关闭,则不允许应用程序请求的操作。
adErrObjectOpen 3705 0x800A0E79
如果对象打开,则不允许应用程序请求的操作。
adErrProviderNotFound 3706 0x800A0E7A
ADO 找不到指定的提供者。
adErrBoundToCommand 3707 0x800A0E7B
应用程序无法用 Command 对象将 Recordset 对象的 ActiveConnection 属性更改为它的来源数据。
adErrInvalidParamInfo 3708 0x800A0E7C
应用程序错误地定义了 Parameter 对象。
adErrInvalidConnection 3709 0x800A0E7D
应用程序通过引用关闭或无效的 Connection 对象来请求对对象的操作。

-------------------------
VBScript 错误信息
----------------------------------------------------

错误代码 信息
5 无效的过程调用或参数
6 溢出
7 内存不够
9 下标越界
10 数组长度固定或临时锁定
11 被零除
13 类型不匹配
14 字符串空间溢出
28 堆栈空间溢出
35 Sub 或 Function 未定义
48 加载 DLL 时出错
51 内部错误
53 文件未找到
57 设备 I/O 错误
58 文件已存在
61 磁盘已满
67 文件太多
70 没有权限
75 路径/文件访问错误
76 路径未找到
91 未设置对象变量或 With 块变量
92 未初始化 For 循环
94 无效的 Null 使用
322 无法创建必要的临时文件
424 要求使用对象
429 ActiveX 部件无法创建对象
430 类不支持 Automation
432 Automation 操作过程中,未找到文件名或类名
438 对象不支持此属性或方法
440 Automation 错误
445 对象不支持此操作
446 对象不支持命名的参数
447 对象不支持当前区域设置
448 未找到命名参数
449 此参数必选
450 参数个数错误或无效的属性赋值
451 对象不是集合
453 未找到指定的 DLL 函数
455 代码资源锁定错误
457 此键已和集合中的元素关联
458 VBScript 中不支持使用 Automation 类型的变量
500 变量未定义
501 非法赋值
502 用此对象进行脚本编程会出错
503 对象不能安全初始化
1001 内存不够
1002 语法错误
1003 缺少“:”
1004 缺少“;”
1005 缺少“(”
1006 缺少“)”
1007 缺少“]”
1008 缺少“{”
1009 缺少“}”
1010 缺少标识符
1011 缺少“=”
1012 缺少“If”
1013 缺少“To”
1014 缺少“End”
1015 缺少“Function”
1016 缺少“Sub”
1017 缺少“Then”
1018 缺少“Wend”
1019 缺少“Loop”
1020 缺少“Next”
1021 缺少“Case”
1022 缺少“Select”
1023 缺少表达式
1024 缺少语句
1025 语句未结束
1026 缺少整型常数
1027 缺少“While”或“Until”
1028 缺少“While”、“Until”或语句结尾
1029 局部变量或参数过多
1030 标识符过长
1031 无效的编号
1032 无效的字符
1033 未终止字符串常数
1034 未终止注释
1035 嵌套的注释
1037 “Me”关键字使用无效
1038 “Loop”缺少“Do”
1039 无效的“Exit”语句
1040 无效的“For”循环控制变量
1041 名称被重定义
1042 必须是行中的第一个语句
1043 无法为非 ByVal 参数赋值
1044 调用 Sub 时不能使用括号
1045 缺少字母常数
1046 缺少“In”
32766 True
32767 False
32811 未找到元素

分享到
  • 微信分享
  • 新浪微博
  • QQ好友
  • QQ空间
点击: