Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Probleme mit ADO und timestamp (https://www.delphipraxis.net/166653-probleme-mit-ado-und-timestamp.html)

willyxv 23. Feb 2012 11:44

Datenbank: Postgre • Version: 9 • Zugriff über: ADO

Probleme mit ADO und timestamp
 
Hallo,

ich möchte gerne Daten von einem Meßgerät in meine Datenbank schreiben. Hierbei ist bei mir folgendes Problem aufgetreten:

Ich verwende einen Timer welcher alle 30 Sek den wert in die Datenbank schreiben soll.
Die Datenbank hat 3 Spalten:
- id (bigserial)
- value (real)
- obtime (timestamp without timezone)

Delphi-Quellcode:
procedure TForm1.timerTimer(Sender: TObject);
var  H,M,S,ms : Word;
      aktzeit : ttime;
      aktdatetime : tdatetime;
begin

// auf 30 Sekunden runden
  Decodetime(now, H, M, S, ms);
    S := (S div 30) * 30;
    aktzeit := Encodetime(H, M, S, ms);
  aktdatetime := strtodatetime(datetostr(now) + ' ' + timetostr(aktzeit));

// In Datenbank speichern
  sql.SQL.Clear;
    sql.SQL.Text := 'INSERT INTO "' + SQLtabelle + '" ("obtime", "value") VALUES (:obtime, :value);';
    sql.Parameters.ParamByName('obtime').Value := aktdatetime;
    sql.Parameters.ParamByName('value').Value := aktwert;
  sql.ExecSQL;

end;
nun erhalte ich die Fehlermeldung: "Typname ist ungültig"

Wenn ich den sql Befehl nur mit value ausführe, funktioniert es.

Ich bin für jede Hilfe sehr dankbar.

MfG Willy

haentschman 23. Feb 2012 11:54

AW: Probleme mit ADO und timestamp
 
Hallo...
Delphi-Quellcode:
Decodetime(now, H, M, S, ms);
S := (S div 30) * 30;
aktdatetime := Encodetime(H, M, S, ms);
... würde das nicht reichen ? EncodeTime gibt ja einen DateTime zurück :zwinker:

generic 23. Feb 2012 12:22

AW: Probleme mit ADO und timestamp
 
Delphi-Quellcode:
 sql.SQL.Text := 'INSERT INTO "' + SQLtabelle + '" ("obtime", "value") VALUES :obtime, :value);';
Hinter Values fehlt eine Klammer-Auf "(".

willyxv 23. Feb 2012 12:27

AW: Probleme mit ADO und timestamp
 
Zitat:

Zitat von generic (Beitrag 1152511)
Delphi-Quellcode:
 sql.SQL.Text := 'INSERT INTO "' + SQLtabelle + '" ("obtime", "value") VALUES :obtime, :value);';
Hinter Values fehlt eine Klammer-Auf "(".

Ja, aber das ist leider nur ein übertragungsfehler im Programm stehts richtig drinne.

Iwo Asnet 23. Feb 2012 12:51

AW: Probleme mit ADO und timestamp
 
Woher weiß ADO, das es sich bei 'obtime' um einen Timestamp (=Datetime) handelt? So schlau ist es nicht; Du solltest den Parameter noch Datentypen spendieren.

Bernhard Geyer 23. Feb 2012 13:02

AW: Probleme mit ADO und timestamp
 
Zitat:

Zitat von Iwo Asnet (Beitrag 1152521)
Woher weiß ADO, das es sich bei 'obtime' um einen Timestamp (=Datetime) handelt? So schlau ist es nicht; Du solltest den Parameter noch Datentypen spendieren.

Das kann ADO schon ganz gut.

Kann es aber sei das Value ein SQL-Schlüsselwort ist? Bennen mal deinen zweiten Parameternamen um.

haentschman 23. Feb 2012 13:04

AW: Probleme mit ADO und timestamp
 
Vieleicht ist ja das hilfreich...
http://entwickler-forum.de/archive/i...p/t-12791.html...ADO und Parameter
Zitat:

Bevor die Parameter-Werte übergeben werden dürfen, muss die Parameter-Kollektion gefüllt werden, damit das ADO-Objekt die Datentypen kennt.
:hi:

willyxv 23. Feb 2012 15:08

AW: Probleme mit ADO und timestamp
 
Ok hab jetzt den Parameter definiert, es funktioniert aber immer noch nicht.

Delphi-Quellcode:
procedure TForm1.timerTimer(Sender: TObject);
var aktdatetime : tdatetime;
begin

  aktdatetime := now;

// In Datenbank speichern
  sql.SQL.Clear;
    sql.SQL.Text := 'INSERT INTO "' + SQLtabelle + '" ("obtime", "value") VALUES (:obtime, :value);';
    sql.Parameters.CreateParameter('obtime', ftdatetime, pdinput, 8, '');
    sql.Parameters.ParamByName('obtime').Value := formatdatetime('yyy-mm-dd hh:nn:ss', aktdatetime);
    sql.Parameters.ParamByName('value').Value := aktwert;
  sql.ExecSQL;

end;
Nun erscheint die Fehlermeldung: "Die anwendung verwendet für den aktuellen vorgang einen Wert vom falschen Typ."

Verwende ich statt ftdatetime, fttimestamp kommt die fehlermeldung : Parameter falsch definiert.

ich hab es auch mit formatdatetime('yyy-mm-dd hh:nn:ss', aktdatetime) schon versucht aber es funktioniert nicht.

Welchen typ muss aktdatetime haben?

haentschman 23. Feb 2012 15:11

AW: Probleme mit ADO und timestamp
 
probiere nochmal deine Varianten ohne als Parameter das Wort "Value" zu benutzen... wie Bernhard schon sagte :zwinker:
Delphi-Quellcode:
VALUES (:obtime, :aValue)
...z.B
Nachtrag: der Feldname heißt auch Value :shock: Ohne es genau zu wissen... das ist bestimmt ein reserviertes Wort und damit als Feldname unbrauchbar. Den problematischen Feldnamen zu quoten könnte die Eselsbrücke sein...

willyxv 23. Feb 2012 15:13

AW: Probleme mit ADO und timestamp
 
geht auch nicht :(

Delphi-Quellcode:
procedure TForm1.timerTimer(Sender: TObject);
var aktdatetime : tdatetime;
begin

  aktdatetime := now;

// In Datenbank speichern
  sql.SQL.Clear;
    sql.SQL.Text := 'INSERT INTO "' + SQLtabelle + '" ("obtime") VALUES (:obtime);';
    sql.Parameters.CreateParameter('obtime', ftdatetime, pdinput, 8, '');
    sql.Parameters.ParamByName('obtime').Value := aktdatetime;
  sql.ExecSQL;

end;

Bernhard Geyer 23. Feb 2012 15:16

AW: Probleme mit ADO und timestamp
 
Ich sehe grad das steht was mit Postgre.

Ich würde darauf Tippen das der ADO-Provider (u.U. auch der Delphi-Wrapper) hier ein paar Fehler mit PostgreSQL hat.

Ich würde aber lieber native Zugriffskompos wie von DevArt verwenden. Hier ist die Problemdichte geringer als bei verwendung von ADO (und evtl. zusätzlich auch noch ODBC).

Und als Argument gegen ADO gibts noch: Microsoft hat ADO/OLE DB abgekündigt. Sollte nicht mehr verwendet werden. Mann soll doch wieder auf das "gute alte" ODBC zurück gehen.

haentschman 23. Feb 2012 15:16

AW: Probleme mit ADO und timestamp
 
Puh... dann bin ich ratlos :( Wie war nochmal die Felddefinition in der DB ?

Wäre statt ADO Zeos als Zugriff möglich ? Ein Versuch wäre es wert...

willyxv 23. Feb 2012 15:36

AW: Probleme mit ADO und timestamp
 
Hmm ok danke, werd wohl schaun das ich zeos installiert bekomme und es damit noch mal versuchen.

shmia 23. Feb 2012 15:43

AW: Probleme mit ADO und timestamp
 
Lass doch mal die doppelten Anführungszeichen weg:
Delphi-Quellcode:
procedure TForm1.timerTimer(Sender: TObject);
var aktdatetime : tdatetime;
begin
  aktdatetime := now;

// In Datenbank speichern
  sql.SQL.Text := 'INSERT INTO ' + SQLtabelle + ' (obtime, value) VALUES(:obtime, :value)';

Assert(sql.Parameters.Count = 2);
Assert(sql.Parameters.ParamInfoAvailable);

  sql.Parameters.ParamByName('obtime').Value := aktdatetime;
  sql.Parameters.ParamByName('value').Value := aktwert;
  sql.ExecSQL;
end;
Doppelte Anführungszeichen für Tabellen- und Feldnamen werden nicht benötigt solange du "saubere" Namen wählst, die nicht gegen die Regeln verstossen.
Ausserdem ist der Strichpunkt ma Ende der SQL-Anweisung nicht nötig und auch der sql.SQL.Clear wird nicht gebraucht.
Die Strategie ist: alles weglassen, was den Parser verwirren könnte.

Bummi 23. Feb 2012 16:07

AW: Probleme mit ADO und timestamp
 
ich kenn e mich nicht mit PostGres aus, aber

TDateTime ist ein Double laut

http://www.teialehrbuch.de/Kostenlos...atentypen.html

ist Timestamp dies nicht (oder zumindest nicht offensichtlich)


TIMESTAMP 8 Bytes von 4713 v.u.Z. bis 1465001 u.Z. Datum und Zeit

willyxv 24. Feb 2012 11:38

AW: Probleme mit ADO und timestamp
 
Vielen Dank für die Hilfe,

es scheint wirklich an der ado-connection zu liegen.

Ich hab es jetzt mit Zeos gelöst und es funktioniert einwandfrei, auch ohne das man die parameter extra definieren muss. Es ist nur etwas nervig, dass man eine dll für postgre mitgeben muss und diese auch noch unterschiedlich für 32 und 64 bit systeme ist.

MfG Willy


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