你目前正处于脱机状态,正在等待 Internet 重新连接

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

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

点击这里察看该文章的英文版: 216873
不再更新的 KB 内容免责声明
本文介绍那些 Microsoft 不再提供支持的产品。因此本文按“原样”提供,并且不再更新。
症状
比较两个字段的条件字符串的 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 方法仅支持一个条件

警告:本文已自动翻译

属性

文章 ID:216873 - 上次审阅时间:08/24/2001 08:40:00 - 修订版本: 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
反馈