Datenbank-Abfrage in C++



  • Guten Morgen zusammen,
    hoffe das mir hier endlich jemand aus meinem kleinen Problem helfen kann.

    Ich habe ein Programm geschrieben, dass über Recordsets und vorher definierten Abfragen bestimmte Daten aus meiner Access DB holen soll.

    Hier ist der passende Code:

    CDatabase db;
    CScheduleRecordset rsSchedule;
    CStudentRecordset rsStudent;
    string SqlString;
    
    [cpp]
    if (db.Open(DSN.c_str()))
    		{
    			if (rsSchedule.Open(CRecordset::forwardOnly,"SELECT * FROM tbl_Schedule ORDER BY Day , Hours"))
    			{
    
    				while (!rsSchedule.IsEOF())
    				{
    					[b]SqlString = "SELECT * FROM tbl_Student WHERE Student_ID = '";
    					SqlString += rsSchedule.m_Student_ID;
    					SqlString += "'";[/b]
    					if (rsStudent.Open(CRecordset::forwardOnly,SqlString.c_str()))
    					{
    [/cpp]
    

    Mein Fehler scheint bei der markierten Abfragenerstellung zu passieren, ich bekomme dann bei "rsStudent.Open(......" folgende Fehlermeldung:
    Datentypin Kriterienausdruck unverträglich".
    Mein erster Gedanke war natürlich gleich das ich da Variablentypen durcheinander geworfen habe, dem ist aber nicht so.
    Sowohl Student_ID als auch rsSchedule.m_Student_ID sind Long-Typen, der einzige Unterschied ist das Student_ID nen AutoWert hat.

    Jetzt ist meine Frage woran kann es liegen das diese Abfrage nicht funktioniert?

    gruß Silver



  • Wenn das Longs sind, dann ist klar, was den nicht passt.
    Schau dir doch mal deinen fertigen SqlString in Zeile 13 an:

    SELECT * FROM tbl_Student WHERE Student_ID = '10'

    (Die 10 hab ich mir mal ausgedacht.)
    Was ist '10'? Ein long? Sicher nicht. 😉



  • Das ist mir gar nicht bewußt gewesen, jetzt stellt sich für mich die Frage wie kann ich das denn ändern? Ich binde in mein Projekt MFC-Klassen ein, die automatisch für den Typ Zahl aus der Datenbank, den Typ long im Programm erstellen.



  • Long ist schon okay.
    '10' aber nicht. '' sind immer um einen STRING. ⚠

    Mach die weg und er sollte nicht mehr meckern. 🙂



  • Na logisch, stimmt ja 🙄
    Das mir das nicht aufgefallen ist, schieb ich jetzt einfach mal auf die Uhrzeit 😃 .
    Danke für deine Hilfe.

    Aber jetzt hab ich ein anderes Problem, "Syntaxfehler im Abfrageausdruck Studen_ID =  ".

    Die Fehlermeldung kann nicht rein Zufälig damit was zu tun haben das in der Tabelle die Student_ID erst bei 1 anfängt? Eigentlich nicht oder? Das dürfte doch relativ egal sein oder ?



  • Das sollte ihm egal sein.
    Ist es noch genau der Code wie oben nur ohne ''?

    Debug doch mal und zeig den String, wie ihn das Open bekommt.



  • Der Code sieht jetzt so aus:

    if (db.Open(DSN.c_str()))
    		{
    			if (rsSchedule.Open(CRecordset::forwardOnly,"SELECT * FROM tbl_Schedule ORDER BY Day , Hours"))
    			{
    
    				while (!rsSchedule.IsEOF())
    				{
    					SqlString = "SELECT * FROM tbl_Student WHERE Student_ID = ";
    					SqlString += rsSchedule.m_Student_ID;
    
    					if (rsStudent.Open(CRecordset::forwardOnly,SqlString.c_str()))
    					{
    

    Der SqlString sieht so aus:
    "SELECT * FROM tbl_Student WHERE Student_ID = "

    Wenn ich mir aber nur die Variable rsSchedule.m_Student_ID angucke, gibt der die richtige Zahl wieder und zwar die 2.



  • Ah, okay du musst die Zahl in einen String wandeln.
    Mach mal statt

    string SqlString;
    

    besser

    CString SqlString;
    

    dann kannst du das machen:

    SqlString.Format("SELECT * FROM tbl_Student WHERE Student_ID = %d", rsSchedule.m_Student_ID);
    if (rsStudent.Open(CRecordset::forwardOnly,SqlString))
    

  • Mod

    SqlString += rsSchedule.m_Student_ID;
    

    ergänzt hier IMHO ein char oder wchar_t! Es wandelt nicht die ID in einen String.



  • Danke für den Hinweis, habe das Problem jetzt gelöst weiß nicht ob es die beste Methode ist, aber das war die die mir jetzt eingefallen ist.
    Habe einen ostringstream erstellt, dort den Long-Wert reinkopiert und dann an den String übergeben.


Anmelden zum Antworten