PRB: Ошибка 3001 сравнение полей как условие для фильтрации набора записей

Переводы статьи Переводы статьи
Код статьи: 216873 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

Проблема

Сравнение двух полей в строке условия фильтра ADO свойства (например: критерий строка состоит из предложения в форме: "FieldName оператор FieldName") создает следующее сообщение об ошибке:
Ошибка выполнения "3001":
Приложение использует аргументы, которые имеют неправильный тип, находится вне допустимого диапазона или противоречат друг другу.

Причина

Эта функция не могут быть реализованы с текущими версиями ADO. Синтаксис условия фильтра ADO свойства определяется следующим образом:
"Оператор FieldName"Literal_Value""
Тип данных "Literal_Value" может быть строка, число или дату. Предыдущее выражение нельзя использовать для сравнения двух полей. При попытке сделать это вызывает ошибку 3001.

Решение

Одно решение заключается в использовании нескольких выражений, соединенных логических операторов в качестве критерия фильтра. Если этого можно использовать только значения полей, по сравнению с известные разработчику. Таким образом разработчик может придумать формулы, критерий строки, удовлетворяющие необходимые результаты. Например,:
rs.Filter = "Field1 Operator1 'Value1' AND Field2 Operator2 'Value2'"
				

Если разработчик не может определить значения Field1 и поле2, разработчик должен использовать пользовательскую процедуру фильтра (в клиентское приложение) или хранимую процедуру (на стороне сервера) для выполнения функций динамически. Можно использовать операторы управления ходом выполнения в настраиваемой фильтр (или хранимой процедуры) для выполнения необходимых полей сравнений и ожидаемые результаты.

Данная статья содержит пример процедуры в разделе «MORE информация» данной статьи.

Предупреждение: Обойти эту проблему, перечисленные в разделе детали сведения только предоставляется в целях иллюстрации без любые гарантии или подразумеваемых, включая, но не ограничиваясь, подразумеваемые гарантии товарности или пригодности для определенной цели.

Статус

Данное поведение является подтвержденной ошибкой продуктов Майкрософт, перечисленных в начале данной статьи..

Дополнительная информация

ADO справочной документации указано за выражение критерия фильтра метода — в разделе Примечания.

Критерий Строка состоит из предложения в форме FieldName - оператор - значение (например, "LastName = 'Smith'"). Составные предложения можно создавать путем объединения отдельных предложений с И (, например, "LastName = 'Smith' И имя ="John"") или или (, например, "LastName = «Smith» или «Фамилия» ="Иванов"").

Также указывается следующее значение условия:

Значение, с которым будет сравнивать значения полей (например, "Петров", # 8/24/95 #, 12.345 или 50,00 долларов). Используйте одинарные кавычки, строками и знаки фунта (#) с датами. Для чисел используйте десятичные знаки доллара и экспоненциальное представление чисел. Если оператор LIKE, значение можно использовать подстановочные знаки. Символ звездочки (*) и знак процента (%) могут подстановочных, и они должны быть последним символом в строке. Value cannot be null..
Действия для воспроизведения поведения:
===========================

  1. Начните новый проект Microsoft Visual Basic. Form1 is created by default.
  2. Set a Project Reference to the Microsoft ActiveX Data Objects 2.x Library.
  3. Insert a command button on the form. Command1 is created by default.
  4. Insert the following code into the General Declaration's section of 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
				
Press F5 to run the project, and error 3001 occurs.

Ссылки

For more information, please refer to the ADO Help documentation.
Для получения дополнительных сведений щелкните следующий номер статьи базы знаний Майкрософт::
195222PRB: ADO Find Method Only Supports One Criteria

Свойства

Код статьи: 216873 - Последний отзыв: 16 ноября 2010 г. - Revision: 2.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft ActiveX Data Objects 2.7
Ключевые слова: 
kbcode kbdatabase kbDSupport kbprb kbmt KB216873 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:216873
Заявление об отказе относительно содержимого статьи о продуктах, поддержка которых прекращена
Эта статья содержит сведения о продуктах, поддержка которых корпорацией Майкрософт прекращена. Поэтому она предлагается как есть и обновляться не будет.

Отправить отзыв

 

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