Announcement

Collapse
No announcement yet.

Filter und Seek in TADODataSet

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Filter und Seek in TADODataSet

    Hallo,
    in einem Programm greife ich auf eine Access2000-Datenbank über ADO zu.

    Die Einstellungen der ADOConnection sind:
    ConnectionString:
    Provider=Microsoft.Jet.OLEDB.4.0;
    Mode=Share Deny None;
    usw.

    CursorLocation = clUseClient

    Mein TADODataSet hat unter anderem folgende Eigenschaften:
    CommandType = cmdTableDirect
    CursorLocation = clUseServer
    CursorType = ctKeyset

    Wenn ich auf dem DataSet einen Filter aktiviere
    Filter := 'login = ' + QuotedStr(AnwenderName);
    Filtered := True;

    und danach mit der Methode Seek versuche einen Datensatz in einem indizierten Feld zu suchen erscheint folgende Fehlermeldung:
    Im Projekt xxx.exe ist eine Exception der Klasse EOLeException aufgetreten. Meldung: Der Vorgang ist in diesem Zusammenhang nicht zugelassen.

    Verschiedene Versuche mit den Einstellungen von CursorLocation oder CursorType haben keinen Effekt.

    Ohne den Filter funktioniert Seek.

    Weiß jemand Rat?

  • #2
    Hallo,

    im Fall einer datensatzorientierten Desktop-Datenbank wie ACCESS macht die Einstellung CursorLocation = clUseClient keinen Sinn, da man dadurch die Doppel-Pufferung über die <i>OLE DB Client Cursor Engine</i> (und somit auch die SQL-Simulation) aktiviert. Die Einstellung clUseClient ist für die mengenorientierten SQL-Datenbanken gedacht.

    Im Fall von ACCESS stehen alle Fähigkeiten nur dann zur Verfügung, wenn <b>clUseServer</b> verwendet wird.

    Zum Seek-Problem zitiere ich aus meinem ADO-Buch: "<i>Beim Vorstellen der Recordset-Eigenschaft Supports habe ich mit einem Beispielprojekt demonstriert, dass je nach verwendetem OLE DB Provider und der Konfiguration der ADO-Objekte bestimmte Fähigkeiten zur Verfügung stehen. Das Beispielprojekt hat im praktischen Versuch nachgewiesen, dass zum Beispiel die Methode Seek für das schnelle Auffinden von Datensätzen nur vom Microsoft Jet OLE DB Provider unterstützt wird. Aber das ist nur dann erfolgreich, wenn das Recordset oder die TADODataSet-Instanz den Wert <b>cmdTableDirect</b> verwenden. In der Abbildung habe ich die Arbeitsschritte zusammengestellt, die als Vorbereitung für den erfolgreichen Aufruf der Methode Seek beim Zugriff auf eine ACCESS-Datenbank notwendig sind. Nachdem die TADODataSet im cmdTableDirect-Modus die ACCESS-Tabelle geöffnet hat und dabei auch einen Index für die Sortierreihenfolge verwendet (Eigenschaft <b>IndexName</b>), steht die Methode <b>Seek</b> zur Verfügung, um nach Treffern in diesem Index zu suchen. Über die verschiedenen Seek-Optionen legen Sie fest, welcher Datensatz ausgewählt werden soll. Über die Option <b>soBeforeEQ</b> können Sie zum Beispien den Datensatzzeiger auf den Datensatz postitionieren, der am nächsten am Suchbegriff dran ist, wenn es keinen direkten Treffer gibt.</i>"

    Comment


    • #3
      Hallo Herr Kosch,
      vielen Dank für die schnelle Antwort. Die Einstellung CursorLocation ist in meinem Projekt nur hängengeblieben, da ich eine Menge von Einstellungen ausprobiert habe um mein Problem zu beheben. Ich arbeite auch mit clUseServer und habe ansonsten auch die Einstellungen wie Sie aus Ihrem Buch zitiert haben (ich glaube fast um ADO zu verstehen wird das wohl zur Pflichtlektüre).
      Allerdings ist mir leider immer noch nicht klar, warum die Kombination des Filtern eines TADODataSets in Verbindung mit Seek nicht funktioniert. Wie gesagt, ein Seek ohne vorherige Filterung der Daten bereitet mir keine Probleme

      Comment

      Working...
      X