SQL-Problem - Insert funktioniert nicht
-
Mmmmhhhhh, das kenne ich eigentlich nur so:
- im Arbeitsbereich einen Klick mit der rechten Maustaste auf das Projekt -> Neue Klasse
- eine neue MFC-Klasse erstellen, Basisklasse CDaoRecordset (nenne ich hier mal CTabelle)
- dann die entsprechende Datenquelle und Tabelle auswählen -> es wird im Projekt eine neue Klasse erstellt, die Membervariablen entsprechend der ausgewählten Tabelle hat
- anstatt deiner Zeile CDaoRecordset rs(&db); müsstest du dann ein Objekt der neu erstellten, von CDaoRecordset abgeleiteten Klasse erstellen: CTabelle rs(&db); (Header von CTabelle includieren) Dann ist auch festgelegt, welche Tabelle gemeint ist.Tja, könnt klappen...
-
Ich habe deinen Vorschlag eingearbeitet. Es kommt immernoch zu der Fehlermeldung, dass 1 Parameter erwartet wird, aber zu wenige übergeben werden.
Beim Debuggen, fiel mir auf, dass die SQL-Anweisung nicht ausgeführt bzw. begonnen wird. Es muss also irgendwo vorher hängen.
Die Klasse CTabelleProjekt ist von CRecordset abgeleitet und die Header-Datei ist eingebunden.Hier der aktuelle Code:
void CNewProject::OnOK() { CDaoDatabase db; db.Open(".mdb"); CTabelleProjekt rs(&db); UpdateData(TRUE); rs.Open(AFX_DAO_USE_DEFAULT_TYPE, "INSERT INTO Tabelle_Projekt (Projekt_ID, Projekt_Beschreibung, Buchungsnummer, ProjektBeginn, ProjektEnde) VALUES ('" + m_Projekt_ID + "', '" + m_Projekt_Beschreibung + "', '" + m_Buchungsnummer + "', '" + m_Projekt_Beginn + "', '" + m_Projekt_Ende + "')",0); rs.Close(); db.Close(); CDialog::OnOK(); }Hab ich deine Vorschläge nicht richtig verstanden/eingebunden oder woran könnte es jetzt noch liegen?
Danke!
-
Aloha,
wat willste denn machen ?
Du hast eine Tabelle namens "Tabelle Projekt". Und die hat ja augenscheinlich Spalten wie Projekt_ID, Projektbeschreibung, usw.'" + m_ProjektID + "' << Da versteh ich nicht, was Du da machst ?!?!
Was soll denn das "+" Zeichen.
Ist ne ernsthafte Frage, sehe da wirklich net den Sinn.
Sind Deine Spalten alles Strings ?
Und nimm die ExecuteSQL-Anweisung der Database.
CString sql = "INSERT INTO Tabelle_Projekt (Projekt_ID, Projekt_Beschreibung, Buchungsnummer, ProjektBeginn, ProjektEnde) VALUES ('" + m_Projekt_ID + "', '" + m_Projekt_Beschreibung + "', '" + m_Buchungsnummer + "', '" + m_Projekt_Beginn + "', '" + m_Projekt_Ende + "')" db.ExecuteSQL(sql);Ich denke in einer Open - Anweisung darfst Du keine Insert Into Sql Anweisung benutzen.
Grüße
BOA
-
Sind das hier Kopierfehler ?
- "Die Klasse CTabelleProjekt ist von CRecordset abgeleitet..." <- von CRecordset oder CDaoRecordset
- db.Open(".mdb"); <- anonymisiert oder vergessen ?Des weiteren:
kannst ja mal NULL anstatt der SQL-Anweisung übergeben, um zu sehen, ob die Datenbank dann geöffnet wird. Bin mir nicht ganz sicher, ob man INSERTs schon beim Open() übergeben kann...
-> mal MSDN gucken -> da steht jedenfalls nix von INSERT bei OpenDie Fehlermeldung taucht bei mir ab und zu auf, wenn die angegebenen Felder nicht mit den tatsächlich vorhandenen Feldern übereinstimmen, also wenn z.B.die Felder Projekt_ID usw. nicht vorhanden oder falsch geschrieben sind oder wenn die Membervariablen der von CDaoRecordset abgeleiteten Klasse nicht mit den tatsächlichen übereinstimmen. Oder aber auch wenn in der Zeile "m_nFields = 12;" eine falsche Anzahl Felder steht.
-
BOA schrieb:
'" + m_ProjektID + "' << Da versteh ich nicht, was Du da machst
Ich tippe mal darauf, m_ProjektID ist eine Membervariable vom Editfeld (hoffentlich CString). Mit UpdateData(TRUE); wird sie mit der Eingabe gefüllt und mit den + in den String der SQL-Anweisung eingebaut. Da sehe ich gerade keine Fehler.
-
@Boa: Wegen dem "+": siehe Beitrag von Isabeau
Werd deine Variante mal probieren!@Isabeau: Bei dem CDaoRecordset hatte ich das DAO nur vergessen zu tippen und die .mdb hatte ich anonymisiert

Isabeau schrieb:
Oder aber auch wenn in der Zeile "m_nFields = 12;" eine falsche Anzahl Felder steht.
Was meinst du damit genau?
Das man Insert nicht beim Open verwenden darf, hab ich noch nie gehört. Werd ich aber mal näher überprüfen. Vielleicht liegts ja daran.
-
Aloha,
aber das braucht es doch normalerweise gar nicht bei einer INSERT INTO Anweisung ?
INSERT INTO MeineTabelle(string1,string2, string3) VALUES ('Ich', 'bin','BOA')reicht...
Ich verstehe die irre vielen "+"-Zeichen vor und hinter den Variablen einfach net ?
Ich meine, kann ja auch ne mögliche Schreibweise sein, ist mir neu, wie gesagt...Grüße
BOA
-
BOA schrieb:
INSERT INTO MeineTabelle(string1,string2, string3) VALUES ('Ich', 'bin','BOA')
Dann würde ich aber immer "Ich", "bin" und "BOA" in die Tabelle schreiben, was ja auch nicht Sinn der Sache ist. Soweit ich weiss sind diese ganzen ", ' und + Teile der Syntax einer Membervariable in einem SQL. Die Membervariable übergibt das, was im Dialog eingegeben wurde. Also das, was letztendlich in die Datenbanktabelle geschrieben werden soll.
Ich lass mich da aber gerne eines besseren belehren! Schliesslich läuft es bei mir ja (noch) nicht...

-
Aloha,
yup, Du hast natürlich Recht. Wer lesen (und denken) kann ist klar im Vorteil.
Wenn Du Variablen übergeben willst ist das korrekt.Ok, da Du jetzt Dir aber ne Klasse angelegt hast, nutze diese, Du hast ja schließlich jetzt Membervariablen...
rs.AddNew(); <--- rs ist Deine Recordset rs.m_variable1 = string1; <--- die m_variable1 ist in Deiner Header von CTabelleProjekt, wenn Du alles korrekt per Klassenassi angelegt hast ! rs.m_variable2 = string2; rs.m_variable3 = string3; rs.Update();Und schwups, isses drinne...
Ich nutze die DB.ExecuteSQL immer bei Konstanten, und die Membervariablen bei Variablen ( <-- lol ).
Grüße
BOA
-
Ok, werd das mal probieren. Hab immer noch keine lauffähige Lösung!
Ein paar Fragen dazu:
Wie mach ich dem klar, dass "string1" eine Spalte in der Tabelle ist? Bei mir sieht das so aus:rs.m_Projekt_ID = Projekt_IDm_Projekt_ID ist die Membervariable und Projekt_ID ist die Spalte der Tabelle.
Ausserdem sind die Spalten Projekt_Beginn und Projekt_Ende Datumstypen. Können die COleTimeDate sein, oder ist irgendein Datentyp zwingend?
Danke dir schonmal für die Hilfe!
-
Aloha noch einmal,
im Prinzip brauchst Du niemanden etwas klar machen.

Durch Dein Erstellen Deiner Klasse CTabelleProjekt hast Du ja Membervariablen für einen Recordset angelegt. Jede Membervariable repräsentiert eine Spalte Deiner Access Tabelle.
Nach Deinem bisherigen Quelltext wäre es so korrekt.
UpdateData(TRUE); CDaoDatabase db; if(db.Open("Database.mdb")){ CTabelleProjekt rs(&db); if(rs.open()){ rs.AddNew(); rs.m_projekt_ID = m_projekt_ID; <--- rs.m_projekt_ID ist die Spalte, in der m_projekt_ID eingetragen wird. <--- m_projekt_ID ohne rs ist der Textstring aus dem Editfeld. rs.variable2 = m_ProjektBeschreibung; rs.variable3 = m_Buchungsnummer; rs.variable4 = m_ProjektBeginn; rs.variable5 = m_ProjektEnde; rs.Update(); rs.Close(); }else{ AfxMessageBox("Konnte Recordset nicht öffnen"); db.Close(); }else{ AfxMessageBox("Konnte DB nicht öffnen"); }Bei COleDateTimes kann ich es nicht sagen, ich arbeite immer mit CTime, die erkennt er ohne Probs.
Einfach mal testen.Grüße
BOA
-
COleDateTime geht auch. In der Header-Datei von CTabelleProjekt einfach COleDateTime als Datentyp vor die Member m_Projekt_Beginn und m_Projekt_Ende schreiben (da steht jetzt bestimmt CTime oder sowas). Allerdings kannst du da keine CStrings rein schreiben. Wenn du das versuchst, kommt genau die Fehlermeldung vom Anfang des Threads.
-
isabeau schrieb:
Allerdings kannst du da keine CStrings rein schreiben. Wenn du das versuchst, kommt genau die Fehlermeldung vom Anfang des Threads.
Aloha,
yup, die Datentypen sollten schon übereinstimmen.

Grüße
BOA
-
Juhu, jetzt klappts!
Ich danke euch für eure geduldige Hilfe!

LeByDo!

-
Aloha,

Beste Grüße
BOA