AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Firedac Query fetch all

Ein Thema von MES · begonnen am 9. Okt 2017 · letzter Beitrag vom 13. Okt 2017
Antwort Antwort
Seite 1 von 2  1 2      
MES

Registriert seit: 23. Dez 2008
Ort: PLZ 73
39 Beiträge
 
#1

AW: Firedac Query fetch all

  Alt 9. Okt 2017, 11:45
Danke für die Rückmeldung, ich befürchte es könnte sich bewahrheiten was Du schreibst. Dann kick ich das Ganze in den Papierkorb und setze wieder Table statt Query ein.

Nehmen wir an, Query1 wäre ein Artikelstamm in dem oft gescrollt wird etc. und das Query2 Zahlungsbedingungen sind.
Wie soll ich den Artikelstamm eingrenzen, nach welchen Kriterien? Und warum? Nur weil ich eine zweite Query mit 20 Datensätze aufmache? Das Fetchen der Daten mit Rowsetsize=50 geht recht fix aber in meinem Beispiel hat der Artikelstamm z.B. 100.000 Datensätze (kann auch eine Million oder mehr haben). Das eigenmächtige Einlesen dieser Datensätze nur weil ich eine 2. Query öffne dauert nicht nur lange (6-7 Sekunden) sondern ist auch unnötig - aus meiner einfachen Sicht als BDE-Umsteiger (von TTable).

Ich vermute eher das es sich um einen Bug handelt. Frage: Ist dieses Verhalten unter anderen Datenbanken auch so?
LG

MES
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#2

AW: Firedac Query fetch all

  Alt 9. Okt 2017, 12:59
Ich hatte diese FetchAll Geschichte eher für ein älteres Problem gehalten.
Wie auch immer, ich arbeite immer mit Where Clause und ich denke, das ist nicht unüblich. FetchAll sind für mich begrifflich sehr nahe an cursor Implementierungen,die sehr spezifisch (Herteller) sein können.
Jede Komponente macht es auch etwas anders, bei Ado sind es maxrecords oder so einfach als Attribut des Dataset.
Denen "goldenen" Weg bei Diredac kenne ich nicht.

Wenn Du Table "gewohnt" bist, musst Du Dich wohl an Query und Where Clause gewöhnen oder solltest zumindest. Das Öffnen einer großen Datenmenge auf dem Server erzeugt auch eine erhebliche Last, ohne dass alle Sätze übertragen werden. Das will man nicht, insbesondere nicht in Mehrbenutzerumgebungen. Sehr leicht verständlich, wenn man sich Umgebungen wie Facebook o.ä. anschaut. Da wird natürlich nicht eine ganze User Table geöffnet nur weil sich einer anmeldet.
Gruß, Jo
  Mit Zitat antworten Zitat
MES

Registriert seit: 23. Dez 2008
Ort: PLZ 73
39 Beiträge
 
#3

AW: Firedac Query fetch all

  Alt 9. Okt 2017, 15:38
Hast ja recht. Deswegen grenze es ja ein:
query1.open('Select * from Artikelstam where Artikeltyp='P') -> ergibt eine Datenmenge von sagen wir mal größer 50. Durch die Rowsetsize werden die ersten 50 geladen.

Nun kommt eine 2 Query die ich öffnen will. Die hat so wenige Datensätze, dass sich eine "where" nicht lohnt (kleiner 50).

query2.open('Select * from Zahlungsbedingungen' ). Jetzt wird bei der Query1 die Rowsetsize automatisch verworfen und es werden alle Datensätze eingelesen.
Selbst wenn ich in der query2 auch ein "where" einbaue (über Parameter) bleibt das Ergebnis unverändert. Zum besseren Verständnis ein weiteres Beispiel: query2 sind Lagerorte auf denen dieser Artikel gelagert ist. Im oberen Grid navigiert man über die Artikel und im unteren Grid werden die Lagerorte angezeigt. Quasi Master/Detail. Kann man sich leich mit Rechungen/Positione etc. auch vorstellen.

Doch ob ich wie oben beschrieben oder die Querys wahllos zum Testen öffne - es erfolgt immer ein "Aushebeln" der Rowsetsize und ein fetch all der query1 ist die Folge. Selbst wenn die Querys in keinerlei Beziehungen zueinander stehen. Es sieht aus, als ob beim Öffnen der 2. Query ein "disconnect" stattfindet um die 2. Query zu connecten und bei dem erneuten Connect der 1. Querry ein fetch all stattfindet. IRRE.
LG

MES
  Mit Zitat antworten Zitat
MES

Registriert seit: 23. Dez 2008
Ort: PLZ 73
39 Beiträge
 
#4

AW: Firedac Query fetch all

  Alt 9. Okt 2017, 16:11
Tagesabschlussmeldung: Es scheint am Verbindungsmanager zu liegen. Diesen verwenden wir um aus einer Ini die Werte raus zu lesen(Typ Persistent).
Stellen wir die Connection ohne den Manger her(in der Entwickungsumgebung) ist alles ok. Es funktioniert auch sauber (also kein fetch all) wenn wir die Verbindung im Quellcode vornehmen. Juhuuuu!!!

Morgen wird intensiv getestet und geforscht - ich werde berichten.
LG

MES
  Mit Zitat antworten Zitat
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
625 Beiträge
 
Delphi XE6 Enterprise
 
#5

AW: Firedac Query fetch all

  Alt 10. Okt 2017, 11:10
Nehmen wir an, Query1 wäre ein Artikelstamm in dem oft gescrollt wird etc
Ja die Freuden der "visuellen Selektion": viele Anwender suchen lieber in einem Grid mit 100.000 Zeilen nach einer Artikelnummer anstatt diese eben in ein Feld einzugeben, Enter, und da hamwer den Artikel...
  Mit Zitat antworten Zitat
MES

Registriert seit: 23. Dez 2008
Ort: PLZ 73
39 Beiträge
 
#6

AW: Firedac Query fetch all

  Alt 10. Okt 2017, 14:49
Testen und verzweifeln ist angesagt. Ich bin sehr geneigt den FirDreck raus zu hauen. Wir drehen uns noch immer im Kreis, mal tuts und mal nicht

Jetzt sind wir so weit, dass in einem Testprojekt alles funzt, im eigentlichen Projekt aber gar nicht bzw. wie beschrieben.
Im Testprojekt funzt es mit dem FDManager nicht, d.h. es wird automatisch ein Fetch all ausgeführt. Ohne den Manger ist es gut.

Wir bauen jetzt Modul für Modul, Komponente für Komponente in das Testprojekt ein - bis es hoffentlich klar ist was dieses absonderliche Verhalten auslöst.
LG

MES

Geändert von MES (10. Okt 2017 um 14:51 Uhr)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#7

AW: Firedac Query fetch all

  Alt 10. Okt 2017, 15:14
Also ich hab irgendwo gelesen, das Fetchall Problem ist ein BDE MS Treiber / Provider Problem.
Ggf. habt Ihr irgendwo noch leichen im Keller, ein bisschen BDE, ein alter Treiber, ...
Gruß, Jo
  Mit Zitat antworten Zitat
bnreimer42

Registriert seit: 26. Mai 2013
Ort: Erlangen, Franken
129 Beiträge
 
Delphi 12 Athens
 
#8

AW: Firedac Query fetch all

  Alt 10. Okt 2017, 15:48
Also laut http://docwiki.embarcadero.com/Libra...taSet.FetchAll bezieht sich FetchAll nur auf das aktuelle Resultset.

Ich verwende FetchAll manchmal, wenn ich nicht eh FetchOptions.Mode auf fmAll gesetzt habe, um alle Datensätze in einem Grid anzuzeigen und hatte da noch nie Nebenwirkungen. Allerdings habe ich mit MariaDB noch nie gearbeitet.

Aber ein kurzer Blick in die MySQL FireDAC Doku bringt den Parameter ResultMode zum Vorschein. Wie ist der denn gesetzt? Wenn der auf Store steht, würde das erklären, wo die Daten des zweiten Resultsets herkommen, denn dann macht er immer FetchAll.
Björn Reimer
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.372 Beiträge
 
Delphi 12 Athens
 
#9

AW: Firedac Query fetch all

  Alt 10. Okt 2017, 17:40
Vielleicht kann hier irgendwer nur eine gleichzeitige Verbindung aufrechterhalten? (FireDAC, DB-Treiber, Datenbank-Server, DBMS, ....)
Bzw. man muß erst irgendwo aktivieren, dass mehrere Verbindungen gehen?

Also sobald über die selbe Connection nun was Neues geht, wird die andere Verbindung getrennt (und vorher noch schnell alles geholt).
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
MES

Registriert seit: 23. Dez 2008
Ort: PLZ 73
39 Beiträge
 
#10

AW: Firedac Query fetch all

  Alt 11. Okt 2017, 15:23
So, wir haben das Problem erheblich einkreisen - aber noch nicht ganz lösen können.

In einem Initbereich war folgendes hinterlegt:
stLibFile := ExtractFileDir(stABSEXE) + '\lib\libmysql.dll';
md.FDPhysMySQLDriverLink1.VendorLib := stLibFile;

Den angegebenen Pfad gab es aber gar nicht. Statt einer Fehlermeldung auszugeben wurde intern danach gesucht(weil es in den uses steht?) und eine Version von libmysql.dll von 2015 genommen. Hm, ganz schön alt dachte ich und durchsuchte meinen PC nach weiteren libmysql.dll. Ich fahnd in einem Ordner eine weitere lib mit dem Datum 2001. Ich biege
also den obigen Quellcode auf diesen Ordner hin und siehe da! Es funktioniert!!! Das FetchAll ist weg!!! Genau das hätte ich aber nicht erwartet den der Treiber ist uralt.

Noch bissl Verwirrung: Ich fand die FireDacAdministrator.exe. Hier wird genau diese uralte Version von libmysql.dll angezeigt. Kein Problem dachte ich, ich stell den Pfad auch hier um - doch wie? In der ConnectionDef.ini ist kein Pfad eingetragen. Weiß jemand wo/wie dieser Pfadeintrag editierbar ist? Oder was die aktuelle Version von libmysql ist?
LG

MES
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz