Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   MSSQL: Verwendung eines TDateTime-Parameters (https://www.delphipraxis.net/170915-mssql-verwendung-eines-tdatetime-parameters.html)

ensaron 10. Okt 2012 09:35

Datenbank: MSSQL • Version: 2012 • Zugriff über: DBX

MSSQL: Verwendung eines TDateTime-Parameters
 
Hallo zusammen,

ich habe ein Problem mit einer Abfrage von Daten aus einer MSSQL-Datenbank.
Folgende Funktion soll die Daten abrufen und zur Übertragung bereitstellen:
Delphi-Quellcode:
function TServerMethods.ReceiveMessages(From, Till: TDateTime): Boolean;
begin
  //[...]
  SQLMessages.Close; //TSQLDataSet
  SQLMessages.CommandText := 'SELECT * FROM MessageTable WHERE Sent BETWEEN :From AND :Till';
  SQLMessages.ParamByName('From').AsDateTime := From;
  SQLMessages.ParamByName('Till').AsDateTime := Till;
  SQLMessages.Open;
  //[...]
end;
Das Feld "Sent" in der Datenbank ist vom Typ "datetime".
Die Abfrage liefert kein Ergebnis, obwohl Daten vorhanden sind.
Auch die Varianten:
Delphi-Quellcode:
  .AsString := FormatDateTime('dd.mm.yyyy hh:nn:ss', From);
  //[...]
und
Delphi-Quellcode:
  .AsSQLTimeStamp:= VarToSQLTimeStamp(VarSQLTimeStampCreate(From));
  //[...]
bringen kein Ergebnis. Bin langsam etwas ratlos, wie ich an die Daten rankomme :|
Kann mir jemand auf die Sprünge helfen?

jobo 10. Okt 2012 10:43

AW: MSSQL: Verwendung eines TDateTime-Parameters
 
Man sollte nicht die von-bis Werte falsch herum angeben.
Uhrzeit sollte bei einer Bereichsangabe nur eine Rolle spielen (= anzugeben sein), wenn die Uhrzeit für den Bereich eine Rolle spielt.
ADO zickt gern bei "falschen" Datumswerten rum. Sprich in der Spalte stehen Werte, die "Out Of ADO Range" sind. Den exakten Range kenne ich nicht, musst Du mal nachsehen oder Deine Spaltenwerte per SQL validieren.

ensaron 10. Okt 2012 11:52

AW: MSSQL: Verwendung eines TDateTime-Parameters
 
Bin am falschen Problem hängengeblieben :wall:
Also die Abfrage funktioniert bei allen drei Varianten und liefert auch das korrekte Ergebnis.
AAAber: Bevor ich dem Client zurückmelde, dass Daten für ihn vorliegen, hab ich einen Test auf
Delphi-Quellcode:
SQLMessages.RecordCount > 0
gemacht. Da bekomme ich aber eine Exception. Ich war etwas irritiert, dass nicht 0 zurückgegeben wird, wenn die Abfrage keine Daten enthält, hab da aber einfach n try-except drumgemacht und versucht rauszufinden, warum denn keine Daten zurückkommen...

Lasse ich die Prüfung weg und lass den Client sich die Daten holen, ist alles da.
Mein Problem besteht also eigentlich darin, warum der Zugriff auf RecordCount der TSQLDataSet-Komponente eine Exception verursacht, obwohl Datensätze enthalten sind.

Gerade mal in der SqlExpr-Unit bei
Delphi-Quellcode:
TCustomSQLDataSet.GetRecordCount
nachgeschaut:
Delphi-Quellcode:
  //[...]
  TableName := ...
  if (TableName = '') or (Params.Count > 0) then
    //Erzeuge eine Exception.
  //[...]
Ähm ja, ich benutze ja Parameter, also ist Params.Count > 0 (und TableName enthält den korrekten Namen). Aber warum wird mir dafür eine Exception erzeugt :?:

Uwe Raabe 10. Okt 2012 12:07

AW: MSSQL: Verwendung eines TDateTime-Parameters
 
Data.SqlExpr.TCustomSQLDataSet.RecordCount

Zitat:

Lesen Sie RecordCount nicht, wenn
Die Datenmenge eine Stored Procedure repräsentiert.
Die Datenmenge eine Abfrage repräsentiert, die Parameter enthält.
Die Datenmenge einen Mehr-Tabellen-Join repräsentiert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz