Announcement

Collapse
No announcement yet.

TDataSource liefert falsche Ergebnisse

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

  • TDataSource liefert falsche Ergebnisse

    Ich verwende Delphi 7 und eine Access-Datenbank. Der Zugriff erfolgt über TTable und TDataSource, die Anzeige der Daten erledigt ein TDBGrid. Sobald ich die Sortierung (Indexname) auf FamilienName stelle, werden sehr häufig Datensätze mit gleichen Familiennamen doppelt angezeigt, dafür fehlen dann die richtigen Datensätze. Wenn man das Grid ein paarmal nach oben oder unten scrollt, ist die Anzeige richtig. Wenn ich CachedUpdates im Dataset auf True stelle, dann funktioniert zwar die Anzeige richtig, dafür kann ich aber keinerlei Daten mehr ändern bzw. neue Datensätze anlegen oder bestehende Datensätze löschen. Kennt jemand dieses Phänomen bzw. ist das wieder ein neuer Bug in Delphi 7 bzw. was kann ich dagegen tun?
    MFG
    Herbert

  • #2
    Hallo,

    welches Datenbankformat verwendet die ACCESS-Datenbank (95er, 97er oder 2000er MDB-Format)? Da der Zugriff über TTable erfolgt, ist einer der beiden BDE-Link-Treiber für das <i>Microsoft DAO Object</i> im Spiel. Welchen Wert zeigt die <i>BDE-Verwaltung</i> für diesen Alias auf der Registerseite <b>Konfiguration</b> in der Spalte <b>DLL32</b> für den Eintrag <b>MSACCESS</b> an? Wenn dort IDDA3532.DLL angezeigt wird und es sich um ein altes MDB-Datenbankformat handelt, was passiert, wenn zum Test IDDAO32.DLL ausgewählt wird?

    &gt;...was kann ich dagegen tun?

    Anstelle der BDE (SQL-Link zum alten DOA-Objektmodell) kann das eigene Programm über ADO oder ADO Express (alias dbGo) auf die MDB zugreifen.

    P.S: Sind UNICODE-Zeichen in dieser ACCESS-Tabelle? Werden zusammengesetzte Indizies verwendet

    Comment


    • #3
      Sehr geehrter Herr Kosch,<BR>
      vorerst mal herzlichen Dank für Ihre rasche Antwort. Ich habe die Access-Tabellen mit Microsoft-Access 2002 erstellt und greife über ODBC darauf zu (vielleicht ginge das mit dem Native-Access besser, nur weiss ich nicht, wie ich darauf zugreifen kann). Unicode-Zeichen sind keine in den Tabellen, jedoch werden zusammengesetzte Indizies verwendet. Ich hatte auch schon versucht, anstatt TTable TQuery zu verwenden, was aber am Ergebnis nichts änderte. Die Spalte DLL32 für MSACCESS zeigt unter Native IDDA3532.DLL und unter ODBC IDODBC32.DLL an. Mit ADO habe ich schon herumgespielt, doch scheitern viele Dinge mangels einer vernünftigen Beschreibung. Welchen Befehl verwende ich in ADO anstatt TTable.Setkey oder TTable.GotoNearest, usw. Die Hilfe von Delphi 7 schweigt leider darüber.<BR>
      MFG<BR>
      Herbert Schneide

      Comment


      • #4
        Hallo,

        &gt;..jedoch werden zusammengesetzte Indizies verwendet.

        das könnte der Grund für das Problem sein, Borland hat in seinen FAQs auf der Community-Webseite eine derartige Fehlerbeschreibung (wenn ich mich richtig erinnere).

        &gt;..doch scheitern viele Dinge mangels einer vernünftigen Beschreibung.

        Hinter den ADO Express- alias dbGo-Komponenten stecken nur VCL-Wrapperkomponenten für die nativen ADO-Objekte von Microsoft. Da diese COM-Objekte sind, gelten die Dokumentations-Regeln von COM: Der Anbieter der Objekte (also in diesem Fall Microsoft) ist für die Dokumentation zuständig, was Microsoft über die Hilfedatei aus dem <i>MDAC SDK</i> in vorbildlicher Art und Weise auch macht. Allerdings liefert Borland diese Doku nicht mit Delphi aus, so dass wird uns das <i>Microsoft Platform SDK</i> selbst besorgen müssen. Und da gibt es ja auch noch mein Buch "ADO und Delphi"....

        &gt;Welchen Befehl verwende ich in ADO anstatt TTable.Setkey oder TTable.GotoNearest...

        ADO verwendet eine andere Philosophie als die BDE, daher sollte man auf die Kompatibilitätskomponenten wie TADOTable etc. verzichten und direkt mit TADODataSet und TADOCommand arbeiten. Bei einer ACCESS-Datenbank im <b>cmdTableDirect</B>-Modus stehen somit folgende Funktion zur Verfügung: <br>
        - TADODataSet-Eigenschaft <b>IndexName</b> (Index-Name zuweisen) <br>
        - TADODataSet-Methode <b>Seek</b> mit der <b>soBeforeEQ</b>-Option sucht den Eintrag, der dem Suchbegriff am ähnlichsten ist

        Comment


        • #5
          Hallo, Herr Kosch,<BR>
          Habe die zusammengesetzten Indizies entfernt, Ergebnis blieb gleich.<BR>
          Alleine nur das Einbinden einer TADODataSet-Komponente verursacht bei der Programmausführung folgenden Fehler: Im Projekt ... ist eine Exception der Klasse EOleSysError aufgetreten. 'Colnitialize wurde nicht aufgerufen'. Prozess wurde angehalten.<BR>
          Wenn ich hingegen in einer neuen Anwendung die TADODataSet-Komponente verwende, so funktioniert das.<BR>
          Das Ergebnis der TADODataSet-Methode Seek mit der Option soBeforeEQ liefert immer das Ergebnis False, also es wird kein entsprechender Datensatz gefunden. Der Aufruf erfolgt so:<BR>
          TADODataSet1.IndexName := 'Familienname';<BR>
          TADODataSet1.Active := True;<BR>
          TADODataSet1.Seek('Mayer', soBeforeEQ);<BR>
          Das Ergebnis ist false, der Datenzeiger im TDBGrid hat sich nicht bewegt, obwohl mehrere 'Mayer' in der Datenbank vorhanden sind.<BR>
          Nun noch zu Ihrem Buch - würde mich sehr interessieren - wo kann ich dieses beziehen, bzw. welche Themen werden dort beschrieben. Liefern Sie auch nach Österreich gegen Nachnahme, etc.?<BR>
          Mit freundlichen Grüssen<BR>
          Herber

          Comment


          • #6
            Hallo,

            &gt;..'Colnitialize wurde nicht aufgerufen'....

            in diesem Fall wurde die .DPR-Datei (Projektdatei) von einer zu alten Delphi-Version angelegt. Um das Problem zu beseitigen, muss die Zeile <b>Application.Initialize</b> an erster Stelle eingefügt werden, wie das folgende Beispiel zeigt:
            <pre>
            ..
            begin
            Application.Initialize;
            Application.CreateForm(TForm1, Form1);
            Application.Run;
            end.
            </pre>

            &gt;...Seek ...

            Hinter ADO steckt eine "eierlegende Wollmilchsau", die sehr freizügig konfiguriert werden kann. Je nach gewählter Einstellung verhält sich das Teil jedoch anders, so dass das Recordset-Objekt die Methode <b>Supports</b> bereitstellt, über die man nachfragen kann, was das Objekt in der aktuellen Einstellung zur Zeit kann und was nicht.

            Im Fall von Seek zeigt der folgende Auszug aus der Objektinspektor-Konfiguration, auf was es ankommt: <br>
            - CursorLocation = clUseServer <br>
            - CommandType = cmdTableDirect <br>
            - IndexName = 'ByName'
            <pre>
            object ADOConnection1: TADOConnection
            Connected = True
            ConnectionString =
            'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Buch\ADO\CDROM\D' +
            'atabase\dbdemos.mdb;Persist Security Info=False'
            CursorLocation = clUseServer
            LoginPrompt = False
            Mode = cmShareDenyNone
            Provider = 'Microsoft.Jet.OLEDB.4.0'
            Left = 136
            Top = 96
            end
            object ADODataSet1: TADODataSet
            Active = True
            Connection = ADOConnection1
            CursorLocation = clUseServer
            CommandText = 'employee'
            CommandType = cmdTableDirect
            IndexName = 'ByName'
            Parameters = <>
            Left = 168
            Top = 96
            object ADODataSet1EmpNo: TIntegerField
            DisplayWidth = 6
            FieldName = 'EmpNo'
            end
            object ADODataSet1LastName: TWideStringField
            DisplayWidth = 17
            FieldName = 'LastName'
            end
            object ADODataSet1FirstName: TWideStringField
            FieldName = 'FirstName'
            Size = 15
            end
            object ADODataSet1PhoneExt: TWideStringField
            FieldName = 'PhoneExt'
            Size = 4
            end
            object ADODataSet1HireDate: TDateTimeField
            FieldName = 'HireDate'
            end
            object ADODataSet1Salary: TFloatField
            FieldName = 'Salary'
            end
            end
            </pre>

            &gt;... ADO-Buch...

            Siehe <i>http://www.entwickler.com/itr/buecher/psecom,id,7,nodeid,92,ps_lo,20.html</i>.

            &#10

            Comment


            • #7
              Hallo Hr. Kosch,<BR>
              Es funktioniert. Entscheidend war <I>TApplication.Initialize</I> und die Tatsache, dass <I>Indexname</I> unmittelbar vor dem Aufruf der Funktion <I>Seek</I> nochmals aufgerufen wurde (obwohl die Datensätze beim Öffnen der Datei im Objektinspektor bereits mit dem Indexnamen gesetzt war). Ich möchte mich auf diesem Wege nochmals sehr herzlich bei Ihnen für Ihre rasche Hilfe bedanken.<BR>
              Ich hätte mir auch sehr gerne Ihr Buch bestellt, habe aber hier von Österreich aus leider keine Möglichkeit, da ich keine Visa-Card oder ähnliche Karten besitze und ein Versand mittels Nachnahme leider nicht angeboten wird. Vielleicht können Sie mir noch den Verleger bzw. eine Buchnummer bekanntgeben, dann werde ich dies nochmals in einer örtlichen Buchhandlung versuchen.<BR>
              Mit freundlichen Grüssen<BR
              Herber

              Comment


              • #8
                Hallo,

                mein ADO-Buch hat die ISDN 3-935042-10-

                Comment

                Working...
                X