Was hab ich da noch falsch? In Datenbank schreiben
-
Hallo,
ich hab bisher mit dem VC++ gearbeitet und muss jetzt Firmenwechsel bedingt auf Borland umsteigen. Mein erstes kleines Projekt, ist, das ich eine Textfile einlese und die eingelesenen Daten vorerst in eine Access DAtenbank schreiben will. Ich hab mich durch das Forum und die Hilfe gewühlt und es sah ganz gut aus. Leider bekomme ich die Fehlermeldung, das ein rechtes Anführungszeichen fehlen würde. Damit kann ich aber echt nichts anfangen. Hier mal der Code:
String filename; FILE * Dat; // Handle für die Datei char buf[400]; // Speicher für den eingelesenen String TParams *stmtParams; // Dateidialog öffnen OpenDialog1->Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*"; OpenDialog1->FilterIndex = 1; // start the dialog showing all files if(OpenDialog1->Execute()) { filename = OpenDialog1->FileName; // Datei öffnen Dat = fopen(filename.c_str(),"r"); // Solange bis Dateiende erreicht ist, Schleife durchlaufen do { // eine Zeile einlesen, Zeile muss mit CR/LF abgeschlossen sein! fgets(buf,400,Dat); // so jetzt muss man den String zerlegen, entweder mitsscanf() oder strtok! // ZAHLENFORMAT (INT, FLOAT,...) und TRENNZEICHEN müssen bekannt sein! if(strlen(buf) > 5) { char * Teil[20]; Teil[0] = strtok(buf,"\t"); // auf Teil[0] steht jetzt der erste Teilstring aus buf Teil[1] = strtok(0,"\t"); Teil[2] = strtok(0,"\t"); Teil[3] = strtok(0,"\n\r"); // create the StateParam parameter and assign its value // Datenbankverbindung herstellen Database1->Connected = true; stmtParams = new TParams(); stmtParams->CreateParam(ftString, "StateParam", ptInput); //stmtParams->Items[0]->AsString = "CA"; // Create the SQL statement to execute AnsiString SQLstmt = "INSERT INTO Test.mdb' " + AnsiString("(Dekor, Kunde, Ort, Auftragsnummer)") + AnsiString("VALUES ('Test', 'Müller','Max', '12345')"); // Execute the statement Database1->Execute(SQLstmt, stmtParams, false, NULL); buf[0] = '\0'; //delete stmtParams; // free the dynamically created Params object } }while(!feof(Dat)); fclose(Dat); } else { }
Wie gesagt ich bin noch Anfänger mit Borland und wäre deshalb für jeden Hinweis dankbar. Wie wie müßte ich das machen, wenn ich bei Values nicht die fest eingetragenen Werte haben will, sondern das da meine eingelesenen Sachen drin stehen?
Noch eine andere Frage: Gibt es im Borland Builder 5.0 C++ eine ähnliche Debug-Funktion wie im VC++, also Hlatpunkt setzen und dann Step by Step weitergehen und sehen was in den einzelnen Variablen drin steht?
-
zur zweiten frage: klick mal im bcb in der menü-leiste auf "start", da werden dir semtliche debug-möglichkeiten angezeigt
konkret:
haltepunkte setzen/entfernen : F5
step by step: F7
-
[quote="ela"]
AnsiString SQLstmt = "INSERT INTO Test.mdb' " +
Hmm was soll der ' den hinter dem mdb?
Debuggen geht natürlich auch, Haltepunkt setzen (links neben dem Codefenster, ka wie ich es beschreiben soll) und mit F7 und F8 durchgehen.
(F7 & F8 sind bei mir die Defaultwerte)
-
dere Fehler kommt doch bestimmt hier oder :
AnsiString SQLstmt = "INSERT INTO Test.mdb' " +
ja gibts ..es drückst links aufs graue kommt nen roter punkt.
-
vielleicht liegt's enfach daran:
AnsiString SQLstmt = "INSERT INTO Test.mdb' " +
also: Test.mdb-->'<--
-
Hallo,
danke für die schnellen antworten. Also das mit der Fehlermeldung hat sich erledigt, das scheint an dem ' gelegen zu haben. Das Programm läuft im Debug-Mode bis zur Zeile:
Database1->Execute(SQLstmt, stmtParams, false, NULL);
und dann sagt er Objekt nicht vorhanden oder gefunden. Was kann das noch sein.
Übrigens mir stürtzt das Borland sehr oft. Was kann ich da noch machen?
-
Hallo,
wenn du die Verbindung zur Datenbank über die Database1-Komponente herstellen konntest (hab ich bei meinen Versuchen leider nicht hingekriegt), so kann das nur noch an der SQL Anweisung liegen. In dieser gibst Du nämlich nicht an, in welcher Tabelle die Insert-Anweisung ausgeführt werden soll.
Wenn deine Tabelle also "Tabelle1" heisst, so mußt du folgende Anweisung schreiben:AnsiString SQLstmt = "INSERT INTO Tabelle1 " + //statt test.mdb AnsiString("(Dekor, Kunde, Ort, Auftragsnummer)") + AnsiString("VALUES ('Test', 'Müller','Max', '12345')");
Hoffe, ich konnt Dir weiterhelfen.
-
btw ist es praktischer std::string zu benutzen ( wenn deine c++ kenntnisse so gut sind wie du auf der hp anpreist )
-
@ 1ntrud0r
1ntrud0r schrieb:
btw ist es praktischer std::string zu benutzen ( wenn deine c++ kenntnisse so gut sind wie du auf der hp anpreist )
was meinst Du damit?
@all
Ich hab die Verbindung zur Datenbank und das Eintragen klappt auch, keine Fehlermeldungen mehr.Eine Sache würde mich jetzt noch Interessieren: Im VC++
kann man folgenden Ausdruck:Test.Format("VALUES ('%s', '%s','%s', '%s]')", Teil[0],Teil[1],Teil[2],Teil[3]);
schreiben und das haut auch hin.
Geht das auch im Borland irgendiwe. Ich glaub ich hab nen Brett vorm KopfDanke
-
Hallo,
Test.Format("VALUES ('%s', '%s','%s', '%s]')", Teil[0],Teil[1],Teil[2],Teil[3]);
Das kannst du in Borland so schreiben :
String Test; //entspricht AnsiString Test.Printf("VALUES ('%s', '%s','%s', '%s]')", Teil[0],Teil[1],Teil[2],Teil[3]);
Die Beschreibung der Printf-Methode findest du in der Hilfe unter "AnsiString-Methoden".
Würde ich aber so nicht empfehlen, besser wäre:
String Test; //entspricht AnsiString Test = "VALUES ("; Test+= "'"+String(Teil[0])+"',"+ "'"+String(Teil[1])+"',"+ "'"+String(Teil[2])+"',"+ "'"+String(Teil[3])+"')";
Natürlich läßt sich das auch mit einer for-Schleife elegant erledigen.
Gruß Burkhard
-
@ Burkhard
Okay, das hab ich verstanden. Funktioniert das auch mit nem AnsiString so, weil das Statement doch eigentlich hierzu:
AnsiString SQLstmt = "INSERT INTO Eingelesene" + AnsiString("(Dekor, Kunde, Ort, Auftragsnummer)") + AnsiString("VALUES ('Test', 'Müller','Max', '12345')");
gehört
-
man kann für formate auch einfach bei sprintf bleiben und den standard wahren .. aber ich denke das wisst ihr schon alles
-
Danke es funzt.
-
Ja, das geht auch, weil String ja AnsiString entspricht, es ist nur eine Typedefinition:
typedef AnsiString String;
Weiß allerdings nicht, wo in der VCL das definiert ist.
Gruß Burkhard
-
Ja, das geht auch, weil String ja AnsiString entspricht, es ist nur eine Typedefinition:
typedef AnsiString String;
Weiß allerdings nicht, wo in der VCL das definiert ist.
Gruß Burkhard
-
ela schrieb:
Noch eine andere Frage: Gibt es im Borland Builder 5.0 C++ eine ähnliche Debug-Funktion wie im VC++, also Hlatpunkt setzen und dann Step by Step weitergehen und sehen was in den einzelnen Variablen drin steht?
Btw: Vielleicht hilft das hier noch etwas weiter:
http://www.junix.ch/bcb/help
Da hats nen Artikel, übers Debuggen mit dem BCB...Und für die Zukunft bitte: Für verschiedene Themen auch verschiedene Threads verwenden. Danke.
-junix