BCB-Struktur zu Datenbank
-
Hallo,
ich habe eine Struktur der Formstruct DataRecord{ TDateTime Zeitstempel; unsigned Inputlevel; unsigned Outputlevel; unsigned Counter0; unsigned Counter1; unsigned Counter2; unsigned Counter3; unsigned Counter4; unsigned Counter5; unsigned Counter6; unsigned Counter7; unsigned Counter8; unsigned Counter9; unsigned Counter10; unsigned Counter11; } DR;die in eine DB (MS-SQL2000-Server) in folgende Tabelle abgespeichert werden soll
[ID] [int] NOT NULL , [Zeitstempel] [smalldatetime] NOT NULL , [Inputlevel] [smallint] NULL , [Outputlevel] [smallint] NULL , [Counter0] [bigint] NULL , [Counter1] [bigint] NULL , [Counter2] [bigint] NULL , [Counter3] [bigint] NULL , [Counter4] [bigint] NULL , [Counter5] [bigint] NULL , [Counter6] [bigint] NULL , [Counter7] [bigint] NULL , [Counter8] [bigint] NULL , [Counter9] [bigint] NULL , [Counter10] [bigint] NULL , [Counter11] [bigint] NULLUnd so sollte es funktionieren:
try { InsertQuery->Close(); InsertQuery->SQL->Clear(); InsertQuery->SQL->Add("INSERT INTO webio1"); InsertQuery->SQL->Add("VALUES""("+DR.Zeitstempel+","+DR.Inputlevel); InsertQuery->SQL->Add(+ "," +DR.Outputlevel + "," + DR.Counter0 + "," +DR.Counter1); InsertQuery->SQL->Add(+ "," + DR.Counter2 + "," + DR.Counter3 + "," + DR.Counter4); InsertQuery->SQL->Add(+ "," + DR.Counter5 + "," + DR.Counter6 + "," + DR.Counter7); InsertQuery->SQL->Add(+ "," + DR.Counter8 + "," + DR.Counter9 + "," + DR.Counter10); InsertQuery->SQL->Add(+ "," + DR.Counter11 + ")"); InsertQuery->Prepare(); InsertQuery->ExecSQL(); } catch (...) { ShowMessage("Fehler beim Einfügen! Tabellenname: WebIO1 Zeit: "+Now()); }Dazu zwei Fragen:
1. TDateTime von BCB 5.0 und smalldatetime passen offensichtlich nicht zusammen. Habe schon einiges probiert. Weiß jemand, in welchem Datentyp ich den Zeitstempel übergeben muss?2. Es kommt eine Fehlermeldung „unzulässige Zeigeraddition“. Der Cursor zeigt dabei hinter das jeweils dritte „+“ der Add-Zeile, nicht aber bei der zweiten Add-Zeile. Seltsam erscheint mir auch, dass die dritte Add-Zeile keinen Fehler produziert, wenn ich sie in die zweite Add-Zeile einbinde, bei gleicher Syntax.
Bin für jeden Hinweis dankbar.
-
zu 2.)
du versuchst ganzzahlen (integer) mit zeichenketten zu addieren und das geht natürlich nicht. versuche es mit IntToStr.
zu 1.)
TDateTime ist intern nichts anderes als ein double. TDateTime hat die Eigenschaft Val die dir diesen wert zurückgibt.
-
@2: char*'s (und String-Literale wie "," sind char*) und int kann man nicht direkt miteinander addieren - du solltest dir also lieber den kompletten Querystring in ein String-Objekt zusammenbauen (AnsiString oder std::string) und dann am Stück übergeben.
-
was mir grad noch auffällt.
// hier ist außerdem das erste + falsch // -> Add fügt eine komplett neue Zeile in die Query-Abfrage ein InsertQuery->SQL->Add(+ "," + DR.Counter2 + "," + DR.Counter3 + "," + DR.Counter4);
-
1. Warum smalldatetime? Weil Du ein wenig Speicherplatz sparst? Und dann bigint als Gegenstück in den anderen Spalten?
2. So kriegst Du Dein Insert-Kommando nicht zusammen.
Du kannst keinen AnsiString zusammenbauen indem Du DateTimes und unsigned's reinschreiben willst.Entweder konvertierst Du alles und baust dann Deinen AnsiString zusammen oder besser: Du verwendest Parameter im Query.
P.S.: Und wieder einmal waren ander schneller....

-
Besten Dank Euch allen für die schnellen Antworten. Ich hab's kapiert und werde es gleich umsetzen.
MichaelC
-
Wenn mich nicht alles täuscht, erwartet der MS-SQL-Server das Datum in Rauten (#) gesetzt. #20.02.2006#
-
Joe_M. schrieb:
Wenn mich nicht alles täuscht, erwartet der MS-SQL-Server das Datum in Rauten (#) gesetzt. #20.02.2006#
Es täucht Dich. Datums-Werte werden in MS-SQL-Server in Hochkommas gepackt, also als String angegeben und implizit zu Datetime konvertiert.
Die Rauten habe hier noch nie gesehen. Ich habe auch gleich nochmal in die Hilfe geschaut. Vielleicht was zu lernen ? aber auch da waren alle Wert in Hochkommas.
-
Sorry, hab Access mit dem MS-SQL-Server verwechselt. In Access ist das so (zumindest in Abfragen, die mal direkt in Access erstellt). Richtige Firma, falsches Produkt...