Ich kriege es einfach nicht hin mit diesem Insert into Befehl
-
Hallo zusammen,
für alle die die es noch nicht wissen sollten, ich bin immer noch an meinem Server/Client Programm dran das auf MFC Dialogen basiert.
Ich bin jetzt an einem Datenbankproblem dran, dass ich einfach nicht gelöst bekommne. Das hier ist mein Code zu Abspeichern von Daten in der Datenbank:[cpp] CDatabase UserData; CString DB_File = "Fuhrpark"; // CString sDriver = "MICROSOFT ACCESS DRIVER (*.mdb)"; CString SqlString; CString strErgebnis; TRY { // Open the database UserData.Open( "Fuhrpark" ); // Allocate the recordset // CRecordset recset( &UserData ); UserData.BeginTrans(); SqlString.Format( "('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')", numberPlate.c_str(), userName.c_str(), finish.c_str(), kmStandBefore.c_str(), kmStandAfter.c_str(), actualDate.c_str(), likelyReturn.c_str(), actualReturn.c_str(), defects.c_str(), status.c_str()); strErgebnis = "Insert into tbl_Vermietung" "(Fahrzeug,Benutzer,Fahrtziel,[Km-Stand vorher],[Km-Stand nachher]", "[Datum der Vermietung],[vorraussichtliche Rückkehr]", "[tatsächliche Rückkehr],Mängel,Status) values "; strErgebnis += (LPCTSTR)SqlString; strErgebnis.Replace("''","'NULL'"); TRACE( LPCTSTR(strErgebnis)); UserData.ExecuteSQL(strErgebnis); // SQL absenden UserData.CommitTrans(); // daten festschreiben // Close the database UserData.Close();[/cpp]
Wenn ich Daten vom Client sende gibt der Server mir die Fehlermeldung: Database Error in der INSERT INTO Anweisung.
Ich dachte zuerst ich hätte irgendwelche Spalten falsch geschriebe, aber die sind alle richtig. Ich versteh es einfach nicht häng jetzt schon ziemlich lange dran und komm einfach nicht dahinter. Hoffe mir kann jemand helfen.gruss Silver
-
Mach mal
strErgebnis.Replace("''","NULL");
Zeig doch mal, was
TRACE( LPCTSTR(strErgebnis));
ausgiebt.
-
- da fehlen Kommata in dem Anweisungsstring zwischen Km-Stand nachher und Datum der Vermietung und zwischen vorraussichtliche Rückkehr und tatsächliche Rückkehr
und falls es dann immer noch nicht geht:
- die ODBC-Datenquelle heisst Fuhrpark ?
- alle Datenbankfelder sind wirklich vom Typ TEXT (auch die Datumsfelder usw.) ?
- die Tabelle heisst wirklich tbl_Vermietung ?
- Sonder- und Leerzeichen in Spaltennamen machen manchmal Probleme ([-äöü)
- lass mal die [ und ] bei den Spaltennamen weg[edit]
...und da fehlt ein Leerzeichen in dem Anweisungsstring hinter tbl_Vermietung
[/edit]
-
Also ich habe schon eine Änderung vorgenommen, ich habe die Kommas hinter den Spaltennamen weg gemacht:
[cpp] strErgebnis = "Insert into tbl_Vermietung " "(Fahrzeug,Benutzer,Fahrtziel,[Km-Stand vorher],[Km-Stand nachher]" "[Datum der Vermietung],[vorraussichtliche Rückkehr]" "[tatsächliche Rückkehr],Mängel,Status) values ";[/cpp]
Das TRACE gibt folgendes zurück:
Insert into tbl_Vermietung (Fahrzeug,Benutzer,Fahrtziel,[Km-Stand vorher],[Km-Stand nachher][Datum der Vermietung],[vorraussichtliche Rückkehr][tatsächliche Rückkehr],Mängel,Status) values (NULL,'Dors','00000000',NULL,NULL,'Montag, 13. Februar 2006','Montag, 13. Februar 2006 ',NULL,NULL,NULL)
Ist alles korrekt , da wo die nullen stehen sollte eigentlich das Fahrtziel stehen , das hat aber glaub ich nichts mit dem Fehler zu tun.
-
Ich habe jetzt noch die Kommatas zwischen Km-Stand nachher und Datum der Vermietung und zwischen vorraussichtliche Rückkehr und tatsächliche Rückkehr gesetzt und nun bekomme ich die Fehlermeldung:
Database Error: Datentypen in Kriterienausdruck unverträglich.
Werde jetzt ,mal die anderen Lösungswege ausprobieren
-
Schau dir die fetten Stellen mal an, ist das gewollt?
Insert into tbl_Vermietung (Fahrzeug,Benutzer,Fahrtziel,[Km-Stand vorher],[Km-Stand nachher][Datum der Vermietung],[vorraussichtliche Rückkehr][tatsächliche Rückkehr],Mängel,Status) values (NULL,'Dors','00000000',NULL,NULL,'Montag, 13. Februar 2006','Montag, 13. Februar 2006 ',NULL,NULL,NULL)
isabeau schrieb:
- da fehlen Kommata in dem Anweisungsstring zwischen Km-Stand nachher und Datum der Vermietung und zwischen vorraussichtliche Rückkehr und tatsächliche Rückkehr
-
Du brauchst keine Kommas, um die einzelnen Teilstrings abzugrenzen, aber innerhalb des SQL-Befehls brauchst du Kommas, um die einzelnen Parameter abzugrenzen (in der zweiten und dritten Zeile direkt vor den schließenden ").
(zu den Nullen: Was steht denn in den verwendeten Variablen? (btw, was für einen Typ haben die?))
-
isabeau schrieb:
- die ODBC-Datenquelle heisst Fuhrpark ?
Ja heisst Sie
- alle Datenbankfelder sind wirklich vom Typ TEXT (auch die Datumsfelder usw.)
Nein ich habe Beziehungen zwischen tbl_Vermietung Fahrzeug[Zahl]und der tbl_Fahrzeug und zwischen tbl_Vermietung Benutzer[Zahl] und tbl_Benutzer
- die Tabelle heisst wirklich tbl_Vermietung ?
Ja
-
Silvercreast schrieb:
Ich habe jetzt noch die Kommatas zwischen Km-Stand nachher und Datum der Vermietung und zwischen vorraussichtliche Rückkehr und tatsächliche Rückkehr gesetzt und nun bekomme ich die Fehlermeldung:
Database Error: Datentypen in Kriterienausdruck unverträglich.
Werde jetzt ,mal die anderen Lösungswege ausprobieren
hab ich schon gemacht
-
Silvercreast schrieb:
- alle Datenbankfelder sind wirklich vom Typ TEXT (auch die Datumsfelder usw.)
Nein ich habe Beziehungen zwischen tbl_Vermietung Fahrzeug[Zahl]und der tbl_Fahrzeug und zwischen tbl_Vermietung Benutzer[Zahl] und tbl_Benutzer
Machst du da nen Insert in einen View oder was willst du uns damit sagen?
Database Error: Datentypen in Kriterienausdruck unverträglich.
Sicher, dass der das Datum so versteht?
Ich hätte das jetzt im Verdacht, dass es der Fehler ist.Welches DBMS nutzt du gleich noch?
-
Sorry das ich mich jetzt erst melde aber es ging nicht früher.
Ich arbeite mit einer Access Datenbank und ich habe in dieser Datenbank Beziehungen gemacht. Diese Beziehnungen laufen über den Wert Zahl in der tbl_Vermietung. Jetzt müsste ich es also irgendwie hinbekommen trotz Beziehungen mir in der tbl_Vermietung einen Text Inhalt anzeigen lassen zu können. Aber wie mach ich das???????????? Versteht Ihr das Problem
-
Achso was noch hinzugefügt werden muss die Beziehungen haben den Index Zahl .
-
Willst du jetzt nen Insert machen oder nen View?
Weil ein Insert in zwei Tabellen gleichzeitig geht nicht.
-
Also ich weiss jetzt ehrlich gesagt nicht was du mit dem View meinst?
Ich habe 3 Tabellen:
- tbl_Vermietung ( hat Beziehungen zu Benutzer und Fahrzeug// Spalten: Fahrezug ,
Benutzer beide müssen zwangsläufig mit Zahl initalisiert werden
, da ansonsten keine Beziehnung enstehen kann.)
- tbl_Benutzer
- tbl_FahrzeugJetzt muss ich es irgendwie schaffen über den Umweg tbl_Benutzer oder tbl_Fahrzeug meine Beziehungsspalten in tbl_Vermietung mit dem richtigen Datensatz zu füllen. Ich bin ganz ehrlich und sage das ich nicht weiss ob ich dazu einen Insert Into Befehl benutzen kann, ich kenne mich nicht gut mit SQL aus. Und wie oben erwähnt kann ich dir auch nicht sagen ob ich ein View machen will , ich verstehe nämlich nicht den zusammenhang zwischen View und Datenbank???
-
Oje, da fehlen dir Grundlagen...
Lies mal da ein wenig, das sieht ganz nett aus: http://www.sql-und-xml.de/sql-tutorial/Ein View ist eine Zusammenfassung von mehreren Tabellen, man kann darin aber nicht schreiben.
Insert geht immer nur in eine Tabelle.Ich habe nochmal den Befehl, den du gezeigt hast angeschaut. Kann es sein, dass du dich bei der Reihenfolge vertan hast?
Ansonsten zeig nochmal, wie es gerade aussieht.
-
Das ist mein Code zum abspeichern.
[cpp]std::string CDatabaseAccess::storeClientData( const std::string &messageFromClient ) { std::vector< std::string > parameters = StringHelper::split( messageFromClient, ';' ); std::string DataInfo = parameters[0]; std::string userName = parameters[1]; std::string numberPlate = parameters[2]; std::string finish = parameters[3]; std::string actualDate = parameters[4]; std::string likelyReturn = parameters[5]; std::string defects = ""; std::string status = ""; std::string kmStandBefore = ""; std::string kmStandAfter = ""; std::string actualReturn = ""; std::string result; CDatabase UserData; CString DB_File = "Fuhrpark"; // CString sDriver = "MICROSOFT ACCESS DRIVER (*.mdb)"; CString SqlString; CString strErgebnis; TRY { // Open the database UserData.Open( "Fuhrpark" ); // Allocate the recordset // CRecordset recset( &UserData ); UserData.BeginTrans(); strErgebnis = "Insert into tbl_Vermietung " "(Fahrzeug,Benutzer,Fahrtziel,[Km-Stand vorher],[Km-Stand nachher]," "[Datum der Vermietung],[vorraussichtliche Rückkehr]," "[tatsächliche Rückkehr],Mängel,Status) values "; SqlString.Format( " ('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s') ", numberPlate.c_str(), userName.c_str(), finish.c_str(), kmStandBefore.c_str(), kmStandAfter.c_str(), actualDate.c_str(), likelyReturn.c_str(), actualReturn.c_str(), defects.c_str(), status.c_str()); strErgebnis += (LPCTSTR)SqlString; strErgebnis.Replace("''","NULL"); //strErgebnis = CString( "Ergebnis: " ) + strErgebnis; TRACE(LPCTSTR(strErgebnis)); MessageBox( 0, LPCTSTR(strErgebnis), "§", MB_OK ); UserData.ExecuteSQL(strErgebnis); // SQL absenden UserData.CommitTrans(); // daten festschreiben // Close the database UserData.Close(); result = "true"; return result; } CATCH(CDBException, e) { // If a database exception occured, show error msg AfxMessageBox("Database error: "+e->m_strError); } END_CATCH; result = "false"; return result; }[/cpp]
Ich weiss net ob ich wirklich ein View benutzen kann , wenn man darin doch nichts schreiben kann.
-
Kann das sein das ich mein Primary Key Feld auch noch angeben muss ??
-
Silvercreast schrieb:
Kann das sein das ich mein Primary Key Feld auch noch angeben muss ??
Wird es denn automatisch hochgezählt?
Aber die Fehlermeldung war ja auch was, dass Datentypen unverträglich sind - wenn der PK fehlt, dann sagt der was vonwegen "Feld kann nicht NULL sein" oder so.Die Feldreihenfolge sieht korrekt aus.
Jetzt wäre noch interessant, welche Typen die Spalten in der Datenbank haben.Und... müssen Leerzeichen und Umlaute in den Spaltennamen sein?
Sowas macht man nicht, das macht nur Ärger.
Nimm _ statt Leerzeichen und schreib die Umlaute so: ae usw.
-
estartu schrieb:
Wird es denn automatisch hochgezählt?
Wie soll ich das testen wenn ich nichts abspeichern kann??
Die Feldreihenfolge sieht korrekt aus.
Jetzt wäre noch interessant, welche Typen die Spalten in der Datenbank haben.Das versuche ich dir schon die ganze Zeit zu erzählen
Die Spalte Benutzer und die Spalte Fahrzeug sind Beziehungen zu anderen Tabellen und haben von daher den Typ Zahl. siehe hierSilvercreast schrieb:
Ich habe 3 Tabellen:
- tbl_Vermietung ( hat Beziehungen zu Benutzer und Fahrzeug// Spalten: Fahrezug ,
Benutzer beide müssen zwangsläufig mit Zahl initalisiert werden
, da ansonsten keine Beziehnung enstehen kann.)
- tbl_Benutzer
- tbl_FahrzeugJetzt muss ich es irgendwie schaffen über den Umweg tbl_Benutzer oder tbl_Fahrzeug meine Beziehungsspalten in tbl_Vermietung mit dem richtigen Datensatz zu füllen.
Und... müssen Leerzeichen und Umlaute in den Spaltennamen sein?
Sowas macht man nicht, das macht nur Ärger.
Nimm _ statt Leerzeichen und schreib die Umlaute so: ae usw.Erledigt!!
-
Silvercreast schrieb:
- tbl_Vermietung ( hat Beziehungen zu Benutzer und Fahrzeug// Spalten: Fahrezug, Benutzer beide müssen zwangsläufig mit Zahl initalisiert werden, da ansonsten keine Beziehnung enstehen kann.)
- tbl_Benutzer
- tbl_FahrzeugWieso trägst du dann String-Werte für dieses Spalten ein?
(ich hab' zwar nur rudimentäre Kenntnisse in SQL, aber Werte in '...' sind afaik Strings)