按条件来筛选记录集的 PRB: 错误 3001 比较字段

文章翻译 文章翻译
文章编号: 216873 - 查看本文应用于的产品
展开全部 | 关闭全部

症状

比较两个字段的条件字符串的 ADO 筛选属性中 (例如: 的条件字符串由窗体中的子句组成:"FieldName 操作员 FieldName") 将产生以下错误:
运行时错误"3001":
应用程序使用了错误类型的、 超出可接受的范围或与另一个冲突的参数。

原因

此功能不能完成与当前版本的 ADO。ADO Filter 属性的标准语法定义如下:
FieldName 操作员 Literal_Value
Literal_Value 数据类型可能是字符串、 编号,或日期。要比较两个字段不能使用前面的表达式。如果试图这样做将引发错误 3001。

解决方案

一个解决方法是通过布尔运算符作为筛选条件联接的多个表达式。您只能使用此如果所比较的字段的值已知的开发人员。这种方式开发人员可以提出条件字符串,以满足所需的结果的公式。例如:
rs.Filter = "Field1 Operator1 'Value1' AND Field2 Operator2 'Value2'"
				

如果开发人员不知道 Field1 和 Field2 值,开发人员必须使用一个自定义的筛选例程,客户端应用程序) 中或 (在服务器端) 的存储的过程动态地完成该功能。您可以使用自定义的筛选例程 (或存储的过程) 执行必要的字段比较,并生成预期的结果中的控制流语句。

本文提供了此类例程本文"更多信息"一节中演示。

警告: 更多信息部分中提供的解决方法是只提供为图目的而不作任何担保任何明示或暗示保证,其中包括但不是限于适销性和/或针对特定用途的适用性的暗示的担保。

状态

Microsoft 已经确认这是在本文开头列出的 Microsoft 产品中的问题。

更多信息

ADO 帮助文档状态筛选方法的条件表达式--在说明下的以下:

条件字符串的构成部分子句在窗体 FieldName-运算符的值 (例如对于"姓氏 Smith =")。您可以通过串联与单个子句创建复合子句 AND (例如对于"姓氏 = Smith 和名字 = John") 或 OR (例如对于"姓氏 = Smith OR 姓氏 = Jones")。

它还说明下列准则条件值的:

值是您将用来比较字段值的值 (例如对于 Smith,# 8/24/95 # 12.345 或 $ 50.00)。使用字符串和日期使用井号 (#) 的单引号。对于数字,可以使用小数点、 美元符号和科学记数法。 如果运算符 LIKE 值可以使用通配符。只将星号 (*) 和百分比签名 (%) 通配符允许使用,并且它们必须是字符串中的最后一个字符。该值不能为 Null。
重现行为的步骤
===========================

  1. 开始一个新的 Microsoft Visual Basic 项目。默认情况下创建 Form1。
  2. 设置 Microsoft ActiveX 数据对象 2.x 库项目引用。
  3. 插入窗体上的命令按钮。默认情况下创建 Command1。
  4. Form1 的常规声明的节中插入以下代码:
   Option Explicit
   Dim cn As New ADODB.Connection
   Dim rs As New ADODB.Recordset

   Private Sub Command1_Click()
       cn.Open "provider=SQLOLEDB;Data Source=<your data source>;User ID=<uid>;" _ 
    "password=;Initial Catalog=pubs;"
       On Error Resume Next
       cn.Execute "drop table tblFilterTest"
       On Error GoTo errh
       ' Create the test table
       cn.Execute "create table tblFilterTest(ID int primary key, Field1  
    varchar(20), Field2 varchar(20))"
       ' Open ADO recordset
       rs.Open "select * from tblFilterTest", cn, adOpenKeyset, 
    adLockOptimistic
       ' Add first record
       rs.AddNew
       rs("ID") = 1
       rs("Field1") = "A"
       rs("Field2") = "B"
       rs.Update
       rs.Requery
   
       ' Add 2nd record
       rs.AddNew
       rs("ID") = 2
       rs("Field1") = "D"
       rs("Field2") = "C"
       rs.Update
       rs.Requery
    
       ' Print original recordset
       Debug.Print "Original Recordset:"
       Debug.Print "====================="

       While Not rs.EOF
            Debug.Print rs("Field1") & vbTab & rs("Field2") 
             rs.MoveNext
       Wend

       rs.MoveFirst

       ' You get error 3001 on the following line
       rs.Filter = " Field1 > Field2 "

       ' To demonstrate the workaround, comment the preceding line and
       ' uncomment the following line:

       ' Call Filter
       Exit Sub

   errh:
       Debug.Print "Error Number:", Err.Number
       Debug.Print "Error Source:", Err.Source
       Debug.Print "Error Description:", Err.Description
   End Sub

   Private Sub Filter()
       Debug.Print "Filtered Recordset: "
       Debug.Print "====================="
    
       While Not rs.EOF
         If rs("Field1") > rs("Field2") Then
             Debug.Print rs("Field1") & vbTab & rs("Field2") 
         End If
         rs.MoveNext
       Wend
   End Sub
				
按 F5 运行项目和错误 3001 时发生。

参考

有关详细的信息,请参阅 ADO 帮助文档。
有关更多的信息,请参阅下面 Microsoft 知识库中相应的文章:
195222PRB: ADO Find 方法仅支持一个条件

属性

文章编号: 216873 - 最后修改: 2001年8月24日 - 修订: 1.0
这篇文章中的信息适用于:
  • Microsoft ActiveX Data Objects 2.0
  • Microsoft ActiveX Data Objects 2.01
  • Microsoft ActiveX Data Objects 2.1
  • Microsoft ActiveX Data Objects 2.1 Service Pack 2
  • Microsoft ActiveX Data Objects 2.5
  • Microsoft ActiveX Data Objects 2.6
  • Microsoft ActiveX Data Objects 2.7
关键字:?
kbmt kbcode kbdatabase kbfix kbprb KB216873 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 216873
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。
不再更新的 KB 内容免责声明
本文介绍那些 Microsoft 不再提供支持的产品。因此本文按“原样”提供,并且不再更新。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com