PRB: Błąd 3001 porównywanie pola jako kryterium filtrowania rekordów

WAŻNE: Ten artykuł nie został przetłumaczony przez człowieka, tylko przez oprogramowanie do tłumaczenia maszynowego firmy Microsoft. Firma Microsoft oferuje zarówno artykuły tłumaczone przez ludzi, jak i artykuły tłumaczone maszynowo, dzięki czemu każdy użytkownik może uzyskać dostęp do całej zawartości bazy wiedzy Knowledge Base we własnym języku. Prosimy jednak pamiętać, że artykuły przetłumaczone maszynowo nie zawsze są doskonałe. Mogą zawierać błędy słownictwa, składni i gramatyki, przypominające błędy robione przez osoby, dla których język użytkownika nie jest językiem ojczystym. Firma Microsoft nie odpowiada za wszelkie nieścisłości, błędy lub szkody spowodowane nieprawidłowym tłumaczeniem zawartości oraz za wykorzystanie tej zawartości przez klientów. Oprogramowanie do tłumaczenia maszynowego jest często aktualizowane przez firmę Microsoft.

Anglojęzyczna wersja tego artykułu to:216873
Zastrzeżenie dotyczące artykułów z bazy wiedzy o produktach wycofanych
Ten artykuł dotyczy produktów, dla których firma Microsoft nie oferuje już pomocy technicznej. Dlatego jest on oferowany w obecnej wersji i nie będzie już aktualizowany.
Symptomy
Porównanie dwóch pól w ciągu kryteria właociwooci ADO filtru (na przykład: ciąg znaków kryterium składa się z klauzul w postaci: "FieldName FieldName operatora") generuje następujący komunikat o błędzie:
Błąd wykonania "3001":
Aplikacja używa argumenty, które są niewłaściwego typu, znajdują się poza dopuszczalnym zakresie lub są w konflikcie z sobą.
Przyczyna
Tej funkcji nie można przeprowadzić przy użyciu bieżącej wersji modelu ADO. Składnia kryteria właociwooci ADO filtru jest zdefiniowane w następujący sposób:
"Operator fieldname 'literal_value'"
Typu danych 'literal_value' może być ciąg, liczba lub data. Za pomocą poprzedniego wyrażenia nie można porównać dwa pola. Próby nie podnosi błąd 3001.
Rozwiązanie
Jeden sposób obejścia problemu jest kilka wyrażeń połączonych przez operatorów logicznych, jako kryterium filtrowania. Można używać tylko tego, jeżeli znane wartości pól w porównaniu dewelopera. W ten sposób deweloper może stworzyć formułę na ciąg znaków kryterium, która spełnia wymagane wyniki. Na przykład:
rs.Filter = "Field1 Operator1 'Value1' AND Field2 Operator2 'Value2'"				

Jeśli programista nie zna wartości pole1 i pole2, deweloper ma realizować funkcje dynamicznie za pomocą niestandardowych rutynowych filtru (w ramach aplikacji klienta) lub procedury przechowywanej (po stronie serwera). Można użyć instrukcji kontroli przepływu w ramach procedury filtr niestandardowy (lub procedury przechowywanej) do wykonywania niezbędnych porównań pola i wygenerować oczekiwanych wyników.

Ten artykuł zawiera wykazanie dla procedury w sekcji "Więcej informacji" tego artykułu.

Ostrzeżenie: Rozwiązania przewidziane w sekcji więcej informacji tylko podany jest w celu ilustracji, bez jakichkolwiek gwarancji wyrażonych wprost, lub tym, ale nie wyłącznie, dorozumianych gwarancji przydatności handlowej i/lub przydatności do określonego celu.
Stan
Firma Microsoft potwierdziła, że jest to problem występujący w produktach firmy Microsoft wymienionych na początku tego artykułu.
Więcej informacji
Dokumentacji ADO pomocy państwa następujące wyrażenie ustalające kryteria metody filtr--pod uwagi:

Ciąg znaków kryterium składa się z klauzul w formularzu FieldName - Operator — wartość (na przykład "LastName = 'Smith'"). Można utworzyć złożone klauzul poprzez konkatenację poszczególnych klauzul z I (na przykład "LastName = 'Smith' I imię = 'John'") lub lub (na przykład "LastName = 'Smith' lub nazwisko ="Kowalski"").

Wartości kryteriów są również Państwa następujących wytycznych:

Wartość jest wartością, z jaką będzie porównywać wartości pola (na przykład "Kowalski", nr 8/nr 24/95, 12.345 lub 50,00 zł). Należy użyć cudzysłowów pojedynczych ciągi i znaki hash (#) z datami. W przypadku numerów można używać separatora dziesiętnego, znaki dolara i notacja naukowa. Jeżeli Operator jest tak jak wartości można używać symboli wieloznacznych. Tylko gwiazdki (*) i znak procentu (%) symbole wieloznaczne są dozwolone i musi być ostatni znak w ciągu. Wartość nie może być Null.
Kroki do odtworzenia problemu
===========================

  1. Uruchamianie nowego projektu programu Microsoft Visual Basic. Domyślnie utworzony zostanie formularz Form1.
  2. Ustaw odwołanie projektu do programu Microsoft ActiveX Data Objects 2.xBiblioteka.
  3. Umożliwia wstawienie przycisku polecenia w formularzu. Polecenia jest tworzony domyślnie.
  4. Wstaw następujący kod do sekcji deklaracji ogólnych formularza 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				
Naciśnij klawisz F5, aby uruchomić projekt i błąd 3001 występuje.
Materiały referencyjne
Aby uzyskać więcej informacji można znaleźć w dokumentacji pomocy obiektów ADO.
Aby uzyskać dodatkowe informacje zobacz następujący artykuł z bazy wiedzy Microsoft Knowledge Base:
195222 PRB: ADO znaleźć metody tylko kryteria obsługuje jeden

Ostrzeżenie: ten artykuł przetłumaczono automatycznie

Właściwości

Identyfikator artykułu: 216873 — ostatni przegląd: 06/22/2011 06:29:00 — zmiana: 2.0

Microsoft ActiveX Data Objects 2.7

  • kbcode kbdatabase kbDSupport kbprb kbmt KB216873 KbMtpl
Opinia