PRB: Fehler 3001 Vergleich Felder als Kriterien zum Filtern von Recordsets

Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.

Den englischen Originalartikel können Sie über folgenden Link abrufen: 216873
Disclaimer zu nicht mehr gepflegten KB-Inhalten
Dieser Artikel wurde für Produkte verfasst, für die Microsoft keinen Support mehr anbietet. Der Artikel wird deshalb in der vorliegenden Form bereitgestellt und nicht mehr weiter aktualisiert.
Problembeschreibung
Vergleichen zwei Felder in der Kriterienzeichenfolge, der die ADO-Eigenschaft Filter (z. B.: die Kriterienzeichenfolge besteht aus Klauseln im Formular: "Feldname Operator FieldName") generiert den folgenden Fehler:
Laufzeitfehler "3001":
Die Anwendung verwendet Argumente, die den falschen Typ sind, liegen außerhalb des zulässigen Bereichs oder stehen in Konflikt mit einem anderen.
Ursache
Diese Funktionalität kann nicht mit aktuellen Versionen von ADO ausgeführt werden. Die Syntax Kriterien die ADO-Eigenschaft Filter wird wie folgt definiert:
"Feldname Operator 'Literal_Value'"
Der 'Literal_Value'-Datentyp konnte Zeichenfolge, Zahl oder Datum sein. Den vorangehenden Ausdruck können Sie zwei Felder vergleichen. Bei dem Versuch, dazu wird angezeigt 3001.
Lösung
Eine Problemumgehung besteht darin, mehrere Ausdrücke, die durch boolesche Operatoren als Kriterien filtern verknüpft. Können Sie nur diese Wenn die die Werte der verglichenen Felder bekanntermaßen der Entwickler. Auf diese Weise kann der Entwickler eine Formel für die Kriterienzeichenfolge ausdenken, die die erforderliche Ergebnisse erfüllt. Beispiel:
rs.Filter = "Field1 Operator1 'Value1' AND Field2 Operator2 'Value2'"				

Wenn der Entwickler nicht die Werte für Field1 und Field2 kennen, muss der Entwickler eine benutzerdefinierte Routine Filter (in der Clientanwendung) oder eine gespeicherte Prozedur (auf der Serverseite) verwenden, um dynamisch die Funktionalität zu erreichen. Sie können Ablaufsteuerung-Anweisungen in benutzerdefinierte Filter-Routine (oder die gespeicherte Prozedur), um die erforderlichen Feld Vergleiche durchführen und die erwarteten Ergebnisse generieren.

Dieser Artikel enthält ein Beispiel für solche eine Routine in der in diesem Artikel im Abschnitt "Weitere Informationen".

Warnung: Die Problemumgehung in Abschnitt Weitere Informationen bereitgestellten nur aus Gründen der Abbildung ohne keine Gewährleistung oder konkludent, einschließlich, aber nicht beschränkt auf konkludenten Garantien der Handelsüblichkeit und/oder Eignung für einen bestimmten Zweck erhält.
Status
Microsoft hat bestätigt, dass es sich hierbei um ein Problem bei den in diesem Artikel genannten Microsoft-Produkten handelt.
Weitere Informationen
Die ADO-Hilfedokumentation besagt Folgendes für die Filter-Methode Kriterienausdruck--unter Bemerkungen:

Die Kriterienzeichenfolge besteht aus Klauseln im Formular Feldname - Operator - Wert (z. B. "LastName = 'Smith'"). Sie können zusammengesetzte Klauseln erstellen, indem einzelne Klauseln mit verketten und (z. B. "LastName = 'Smith' AND FirstName = 'John'") oder OR (z. B. "LastName = 'Smith' OR LastName = 'Jones'").

Außerdem wird die folgenden Richtlinien für die Kriterien besagt:

Wert ist der Wert, mit denen die Feldwerte vergleichen wird (beispielsweise "Smith", # 8/24-95 #, 12.345 oder 50,00 €). Verwenden Sie einfache Anführungszeichen mit Zeichenfolgen und Nummernzeichen (#) mit Daten. Für Zahlen können Sie Dezimalzeichen, Dollarzeichen und die wissenschaftliche Notation. Wenn Operator LIKE Wert Platzhalter verwenden kann. Nur das Sternchen (1) und Prozent (%) signieren Platzhalter sind zulässig, und Sie müssen das letzte Zeichen der Zeichenfolge sein. Der Wert darf nicht Null sein.
Schritte zum Reproduzieren des Verhaltens
===========================

  1. Starten Sie ein neues Microsoft Visual Basic-Projekt. Form1 wird standardmäßig erstellt.
  2. Legen Sie einen Projektverweis auf Microsoft ActiveX Data Objects 2.x Library.
  3. Einfügen einer Befehlsschaltfläche auf dem Formular. Command1 wird standardmäßig erstellt.
  4. Fügen Sie in der Allgemein Deklaration-Abschnitt von Form1 den folgenden Code:
   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				
Drücken Sie F5, um das Projekt und Fehler 3001 ausgeführt wird.
Informationsquellen
Weitere Informationen finden Sie in der Hilfe von ADO-Dokumentation.
Weitere Informationen finden Sie in der folgenden Artikel der Microsoft Knowledge Base:
195222PRB: ADO Find-Methode nur unterstützen eine Kriterien

Warnung: Dieser Artikel wurde automatisch übersetzt.

Vlastnosti

ID článku: 216873 - Poslední kontrola: 08/24/2001 08:40:00 - Revize: 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 KbMtde
Váš názor