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

ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.

Эта статья на английском языке:216873
Заявление об отказе относительно содержимого статьи о продуктах, поддержка которых прекращена
Эта статья содержит сведения о продуктах, поддержка которых корпорацией Майкрософт прекращена. Поэтому она предлагается как есть и обновляться не будет.
Проблема
Сравнение двух полей в строке условия фильтра 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.xLibrary.
  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

Внимание! Эта статья переведена автоматически

Vlastnosti

ID článku: 216873 – Posledná kontrola: 11/16/2010 11:48:00 – Revízia: 2.0

Microsoft ActiveX Data Objects 2.7

  • kbcode kbdatabase kbDSupport kbprb kbmt KB216873 KbMtru
Pripomienky