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

Tłumaczenia artykułów Tłumaczenia artykułów
Numer ID artykułu: 216873 - Zobacz jakich produktów dotyczą zawarte w tym artykule porady.
Rozwiń wszystko | Zwiń wszystko

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.x Biblioteka.
  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

Właściwości

Numer ID artykułu: 216873 - Ostatnia weryfikacja: 22 czerwca 2011 - Weryfikacja: 2.0
Informacje zawarte w tym artykule dotyczą:
  • Microsoft ActiveX Data Objects 2.7
Słowa kluczowe: 
kbcode kbdatabase kbDSupport kbprb kbmt KB216873 KbMtpl
Przetłumaczone maszynowo
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.

Przekaż opinię

 

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