会员登录 - 用户注册 - 网站地图 Office中国(office-cn.net),专业Office论坛
当前位置:主页 > 技巧 > Access技巧 > DAO/ADO/ADP > 正文

更新访问权限 (Jet) 数据库中的 40 多个字段

时间:2013-06-26 23:04 来源:微软 作者:微软 阅读:

如何: 更新访问权限 (Jet) 数据库中的 40 多个字段

 

概要

当使用 RDO 或 ADO 访问 (Jet) 数据库中的数据更新时,将出现下面的错误:
查询是太复杂
由于 Jet 数据库引擎的限制,如果要更新的记录集包含 40 个以上的域,会出现此错误。

使用 Jet 3.51 引擎,如果要更新的记录集包含 50 个以上的字段发生此错误。Jet 4.0 引擎和更高版本中,如果要更新的记录集包含多于 99 字段将发生此错误。

使用 Jet 4.0 引擎和更高版本,您可能会看到错误:
表达式太复杂
-或者-
已定义的字段太多
本文介绍了该问题方案、 Jet 的限制和几种解决方法。

更多信息

执行 update () 或 BatchUpdate() RDO 的 rdoResultset 对象的方法或 ADO 记录集的 update () 或 UpdateBatch() 方法时对象时,ODBC 错误 S1000"是过于复杂查询"(Visual Basic 运行时错误 40002)。使用 Microsoft Jet OLE DB 提供程序的版本 3.51 及更高版本时,发生了错误,相同的说明。

由于 ADO 和 RDO 的默认行为是使用记录集中的每个字段确定要在服务器上进行更新的记录,将发生此问题。也就是说,当试图更新时,更新 SQL 查询被发送到服务器。此查询的一部分是一个 WHERE 子句,用来标识要更新的记录。AND 子句出现在 WHERE 子句中的每个字段用于这一发现。与 40 多个字段中更新记录集涉及 40 多个插手与 WHERE 子句。

Jet 引擎允许仅 40 的 AND 子句,其中 SQL 或 HAVING 子句中。Jet 3.51 增加到 50 的 AND 子句,此限制,并且 Jet 4.0 增加 99 AND 子句的限制。在遇到 SQL 语句时,Access 引擎返回"查询不太复杂的"错误。请参阅本指南的详细信息的参考部分。

有几种方法来避免这种情况:
  1. 对于新的应用程序,可使用 Access 数据库时使用 DAO。DAO 专为此目的,并不会发出 SQL 查询来执行更新。请注意 RDO 和尤其是 ADO 旨在有效地运用许多其他类型的数据库,对于应用程序,将与不同的服务器进行交互或的将是升迁将来例如使用 Microsoft SQL Server,都建议使用。
  2. 在打开的记录集更新的情况 (如 RDO OpenResultset 或 ADO OpenRecordset 方法) 时,选择特定的和 40 个或更少的字段。
  3. 使用服务器端游标:
    • 若要执行此操作在 ADO 中,adUseServer 为在打开记录集之前设置记录集对象的 CursorLocation 位置属性:
               ...
               Dim rs As ADODB.Recordset
               Set rs = New ADODB.Recordset
               rs.CursorLocation = adUseServer
               rs.Open ...
                  ...
      							
    • 在 RDO,在调用 OpenConnection() 方法之前设置 rdoEnvironment 对象的 CursorDriver 属性:
               ...
               Dim eng As RDO.rdoEngine
               Dim cn As RDO.rdoConnection
               Dim env As RDO.rdoEnvironment
               Dim rs As RDO.rdoResultset
      
               Set eng = New rdoEngine
               Set env = eng.rdoCreateEnvironment(...)
               env.CursorDriver = rdUseServer
               Set cn = env.OpenConnection(...)
               Set rs = cn.OpenResultset(...)
               ...
       
      							
  4. 确保一个独一无二的密钥用于标识要更新,而不是使用每个字段的默认行为的记录。一个唯一密钥 (尽管不一定是为主键) 必须在为此项工作的技术是基础记录集定义。
    • 若要执行此操作在 ADO 中 (这不会在 ADO 2.0 之前的版本中),请记录集对象的"更新条件"属性设置为 adCriteriaKey 上。这起两者的 update () 和 UpdateBatch() 方法:
               ...
               Dim rs As ADODB.Recordset
               Set rs = New ADODB.Recordset
               rs.CursorLocation = adUseClient
               rs.Properties("Update Criteria").Value = adCriteriaKey
               rs.Open ...
               ...
          
      							
    • Rdo,使用 ClientBatch 游标库,并确保不要将结果集对象的 UpdateCriteria 属性设置为 rdCriteriaAllCols。默认情况下,此属性设置为 rdCriteriaKey,这将导致使用来确定要在服务器上更新的行的主键值:
               ...
               Dim eng As RDO.rdoEngine
               Dim cn As RDO.rdoConnection
               Dim env As RDO.rdoEnvironment
               Dim rs As RDO.rdoResultset
      
               Set eng = New rdoEngine
               Set env = eng.rdoCreateEnvironment(...)
               env.CursorDriver = rdUseClientBatch
               Set cn = env.OpenConnection(...)
               Set rs = cn.OpenResultset(...)
               rs.Edit
               ...
               rs.UpdateCriteria = rdCriteriaKey
               rs.Update
               ...
          
      							

(责任编辑:admin)

顶一下
(3)
100%
踩一下
(0)
0%
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价: