Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Delphi 7 und TQuery-Parameter (https://www.delphipraxis.net/48716-delphi-7-und-tquery-parameter.html)

goolaf 29. Jun 2005 14:34

Datenbank: Sybase • Version: 7 • Zugriff über: BDE und ODBC

Delphi 7 und TQuery-Parameter
 
Hallo,
ich habe folgendes Problem, seit ich unsere Anwendung von Delphi 5 und Sybase 6 auf Delphi 7 und Sybase 7 umgestellt habe:

Ich benutze eine TQuery, in welche ich folgenden SQL-Script eingetragen habe:
SQL-Code:
select df_ndl,df_datauftannahme,df_lfdnrauftrag,df_kundennr,df_kzeuro,
df_serviceart,df_belegtyp,df_vkgesamt,df_auftstatus
from dba.tb_auftrag
where df_ndl=:par_ndl
and df_datauftannahme between :par_datauftannahme1 
and :par_datauftannahme2 
and df_auftstatus=:par_auftstatus
order by df_kundennr,df_datauftannahme
Im Programm selbst übergeb ich dann folgende Parameterwerte:
Delphi-Quellcode:
params.parambyname('par_ndl').asstring:='CGN';
params.parambyname('par_datauftannahme1').asdatetime:=strtodate('01.06.2005');
params.parambyname('par_datauftannahme2').asdatetime:=strtodate('30.06.2005');
params.parambyname('par_auftstatus').asinteger:=3;
Diese Abfrage dauert Ewigkeiten (ich arbeite noch mit der BDE), obwohl in Sybase hierfür ein Index vorgesehen ist und dieser auch, wenn ich die Abfrage direkt auf Sybase starte, benutzt wird und mir sofort ein Ergebnis anzeigt.

Ändere ich das Programm wie nachfolgend ab:
Delphi-Quellcode:
sql.Clear;
sql.add('select df_ndl,df_datauftannahme,df_lfdnrauftrag,df_kundennr, df_kzeuro,df_serviceart,df_belegtyp,df_vkgesamt,df_auftstatus');
sql.add('from dba.tb_auftrag where df_ndl=''CGN'' and df_datauftannahme between ''2005-06-01'' and ''2005-06-30''');
sql.add('and df_auftstatus=3 order by df_kundennr,df_datauftannahme');
d.h.ich baue für die TQuery erst im Programm selbst den Befehl auf, dann habe ich wie gewohnt sofort ein Ergebnis.

Was läuft hier bei Delphi 7 anders? Die Befehle, die durch die BDE geschickt werden, sind doch absolut identisch, nur das ich eben einmal mit Parametern und diese dann im Programm belege und das andere mal mit Echtwerten arbeite.
Hat jemand ähnliche Erfahrungen mit Delphi 7 gemacht und eventl. eine Lösung?

[edit=Sharky]SQL- und Delphi-Tags gesetzt. Mfg, Sharky[/edit]

marabu 29. Jun 2005 15:37

Re: Delphi 7 und TQuery-Parameter
 
Hallo Olaf,

wenn du Query.Prepare verwendest bin ich ratlos.

marabu

goolaf 29. Jun 2005 15:49

Re: Delphi 7 und TQuery-Parameter
 
Hallo Marabu,

egal, ob mit oder ohne Prepare, die Abfrage mit den Parametern dauert Ewigkeiten (heißt, er geht die Tabelle, die sehr groß ist, vermutlich sequentiell durch).

Bernhard Geyer 29. Jun 2005 16:00

Re: Delphi 7 und TQuery-Parameter
 
Zitat:

Zitat von goolaf
Was läuft hier bei Delphi 7 anders? Die Befehle, die durch die BDE geschickt werden, sind doch absolut identisch, nur das ich eben einmal mit Parametern und diese dann im Programm belege und das andere mal mit Echtwerten arbeite.
Hat jemand ähnliche Erfahrungen mit Delphi 7 gemacht und eventl. eine Lösung?

Was macht dich so sicher das Delphi schuld ist.
Du hast den Fehler gemacht gleichzeitig mindestens 2 Teile am System auszutauschen (vermutlich auch mehr Teile) so das folgende Programmteile das Problem verursachen können:

Delphi-VCL-Wrapper um BDE:
Fehler in aktuallen Wrapper. Aber Borland hat seit Jahren dort keine grundlegenden Änderungen vorgenommen

BDE:
Ist auch schon nicht mehr viel geändert worden. Evtl. spielt BDE <-> ODBC nicht mehr so 100% mit

ODBC:
Hast du auch einen neuen Rechner (anderes Betriebssystem), so hast du auch komplett andere ODBC-Treiber

Sybase-ODBC-Treiber:
Du hast vermutlich auch neue ODBC-Treiber für Sybase eingespielt

Sybase-DB:
Ist natürlich auch komplett anders.

Dein Programm läuft so

Anwendung <-> BDE <-> ODBC <-> Sybase-ODBC <-> Sybase-Client-Libaray <-> Sybase-Datenbank.



Ich empfehle dir native-Treiber wie SQLDirect um diesen Protokollstack um welten zu vereinfachen:

Anwendung <-> Sybase-Client-Libray <-> Sybase-Datenbank.

Und du wirst bei weiten weniger Probleme haben. Und führe die Umstellung lieber heute als morgen durch.

goolaf 30. Jun 2005 07:02

Re: Delphi 7 und TQuery-Parameter
 
Hallo Bernhard,

ich bin mir nicht 100%-ig sicher, aber die Vermutung liegt doch sehr nahe, das es zumindest nicht an Sybase liegt. Denn eine Abfrage direkt auf Sybase bringt ja gewünsche Ergebnisse. Die Abfrage im Programm ohne Parameter bringt auch das gewünschte Ergebnis, nur in Verbindung mit Parametern sieht es schlecht aus (nicht generell, aber sobald ich Zeiträume abfrage, z.B. mit between).
Wenn ich herausfinde könnte, was auf dem Weg BDE <-> ODBC <-> Sybase-ODBC <-> Sybase-Client-Libaray <-> Sybase-Datenbank als endgültige Abfrage an die Sybase-Datenbank geschickt wird, wär ich vielleicht schlauer, aber da habe ich bei Sybase bisher nichts gefunden, was mir das anzeigt.
Aber vielen Dank für deine Hinweise, ich werde diese mal alle prüfen

Bernhard Geyer 30. Jun 2005 07:18

Re: Delphi 7 und TQuery-Parameter
 
Zitat:

Zitat von goolaf
ich bin mir nicht 100%-ig sicher, aber die Vermutung liegt doch sehr nahe, das es zumindest nicht an Sybase liegt. Denn eine Abfrage direkt auf Sybase bringt ja gewünsche Ergebnisse. Die Abfrage im Programm ohne Parameter bringt auch das gewünschte Ergebnis, nur in Verbindung mit Parametern sieht es schlecht aus (nicht generell, aber sobald ich Zeiträume abfrage, z.B. mit between).

Eine parametriesierte Abfrage schaut bezüglich das was auf der DB-Seite ankommt sehr viel anders aus (Am Beispiel MS-SQL-Server):

Normele Query:
SQL-Code:
SELECT * FROM MyTable where MyFeld = 'FeldWert'
Parametrisierte Query:
SQL-Code:
exec sp_executesql N'select MyTable where MyFeld = @P1', N'@P1 nvarchar(8)', N'FeldWert'
Und hier kann natürlich Delphi/BDE/ODBC evtl. Fehler machen (SQL-Typ falsch bestimmen, ...)


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:10 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