![]() |
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:
nun erhalte ich die Fehlermeldung: "Typname ist ungültig"
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; Wenn ich den sql Befehl nur mit value ausführe, funktioniert es. Ich bin für jede Hilfe sehr dankbar. MfG Willy |
AW: Probleme mit ADO und timestamp
Hallo...
Delphi-Quellcode:
... würde das nicht reichen ? EncodeTime gibt ja einen DateTime zurück :zwinker:
Decodetime(now, H, M, S, ms);
S := (S div 30) * 30; aktdatetime := Encodetime(H, M, S, ms); |
AW: Probleme mit ADO und timestamp
Delphi-Quellcode:
Hinter Values fehlt eine Klammer-Auf "(".
sql.SQL.Text := 'INSERT INTO "' + SQLtabelle + '" ("obtime", "value") VALUES :obtime, :value);';
|
AW: Probleme mit ADO und timestamp
Zitat:
|
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.
|
AW: Probleme mit ADO und timestamp
Zitat:
Kann es aber sei das Value ein SQL-Schlüsselwort ist? Bennen mal deinen zweiten Parameternamen um. |
AW: Probleme mit ADO und timestamp
Vieleicht ist ja das hilfreich...
![]() Zitat:
|
AW: Probleme mit ADO und timestamp
Ok hab jetzt den Parameter definiert, es funktioniert aber immer noch nicht.
Delphi-Quellcode:
Nun erscheint die Fehlermeldung: "Die anwendung verwendet für den aktuellen vorgang einen Wert vom falschen Typ."
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; 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? |
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:
...z.B
VALUES (:obtime, :aValue)
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... |
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; |
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 ![]() 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. |
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... |
AW: Probleme mit ADO und timestamp
Hmm ok danke, werd wohl schaun das ich zeos installiert bekomme und es damit noch mal versuchen.
|
AW: Probleme mit ADO und timestamp
Lass doch mal die doppelten Anführungszeichen weg:
Delphi-Quellcode:
Doppelte Anführungszeichen für Tabellen- und Feldnamen werden nicht benötigt solange du "saubere" Namen wählst, die nicht gegen die Regeln verstossen.
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; 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. |
AW: Probleme mit ADO und timestamp
ich kenn e mich nicht mit PostGres aus, aber
TDateTime ist ein Double laut ![]() ist Timestamp dies nicht (oder zumindest nicht offensichtlich) TIMESTAMP 8 Bytes von 4713 v.u.Z. bis 1465001 u.Z. Datum und Zeit |
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