TIBDataSet Seltsamkeit



  • Hi
    Bei mir tritt bei edr TIBDataSet-komponente ein seltsames Phänomen auf
    Teilweise wird die eigenschaft RecordCount nicht richtig wiedergegeben.

    Versetze ich die Funktion die auf diese Eigenschaft zugreift jedoch weiter nach hinten im Quelltext so funktioniert alles. Weiss jemand woran das liegt?



  • nicht richtig wiedergegeben ist nicht die beste fehlerbeschreibung!

    zeig doch mal den code wo sie verwendet wird!



  • liegt daran, das nicht alle Daten gefetcht werden und RecordCount
    kein SQL a la "SELECT COUNT(*) FROM ..." generiert.

    also:
    vorher TIBDataSet.Last() oder TIBDataSet.FetchAll() aufrufen.
    (oder eben mit SQL arbeiten)

    c ya, cPanther



  • Benötigst du überhaupt eine Komponente, die den gesamten Recordset im Clientrechner puffert? Wenn nicht -> TIBQuery verwenden.

    RecordCount ist sowieso mit Vorsicht zu geniessen, ein SELECT COUNT xxx FROM yyy ist grundsätzlich günstiger, da es im Kontext des Server läuft und nicht erst alle Datensätze zum Client übertragen werden müssen.



  • aha so ist das, danke!
    tibdataset benutze ich weil es mir sehr einfach zu bedienen vorkommt.
    Das mit dem puffer auf dem client-rechner.
    Also c++ im allgemeinen und datenbank-programmierung im speziellen ist noch relativ neu für mich. Aber wird bei tibquery nicht zwangsläufig auch gepuffert wenn du eine select anweisung gespeichert hast?



  • Jain. Bei IBDataSet wird die komplette Datenmenge im Speicher des Clientrechners gehalten. Bei IBQuery wird nur eine bestimmte Menge Speicer des Clientrechners verwendet und immer nur ein Teil der Datenmenge vorgehalten. Je nachdem kann das unter Umständen natürlich bedeuten, dass Du hierbei mehr Netzwerktraffic verursachst, insbesondere wenn Du in der Datenmenge vor und zurück iterierst. Benötigst Du sowieso nur eine Richtung, solltest Du Unidirectional auf True setzen. Das spart nochmals Speicher und ist schneller.



  • vielen dank für die auskunft



  • @ Joe_M.
    Bist du dir sicher, daß TIBDataSet alle Daten lokal speichert?
    Ich denke eher nicht. 🙄
    Scroll doch mal durch eine große Datenmenge...

    Erst mit FetchAll werden alle Daten abgerufen. Daher auch das
    "undefinierte" RecordCount vor dem Aufruf.

    (BCB 6.0, ohne IBX Updates)

    c ya, cPanther



  • @ajcPanther: Ich habs zumindest so interpretiert. Füge mal Daten in eine Tabelle über ein Dataset und eine Query ein. So ab dem 5000ten eingefügten Datensatz wird ein Dataset quälend langsam. Bei einem Projekt, in dem Logfiles mit je ca. 50.0000 Zeilen eingelesen werden, kommt spätestens beim dritten Logfile die Meldung: Nicht genügend Speicher. Egal ob zwischendurch commited wird, oder nicht.



  • TIBSQL
    "behält" Clientseitig keine Datensätze. Also ideal für Abfragen über große
    Mengen (Updates, Inserts, DDL...)

    TIBDataSet
    Behält jeden irgendwie/wann/wo mal gefetchten Datensatz im Speicher.
    (z. B. durch Next, First, FetchAll, bla...) Aber -nicht- die gesamten Datensätze. (Ganz gut geeignet für UI snychro eben)

    Hm, ich glaub wir meinten das gleiche, nur anders... 😃

    so, Wochenende,

    NET STOP "Firebird Server - DefaultInstance"
    NET STOP "Firebird Guardian - DefaultInstance"
    

    😉

    c ya, cPanther



  • ja, sieht so aus... 😉

    Ebenfalls Schönes Wochenende.


Anmelden zum Antworten