SQL-Abfragen in VC++ 6



  • Hi,

    ich bin gerade an meinem ersten Project mit DB Abindung.(VC++ 6, mySQL5) der Einfachheit halber habe ich die DB per ODBC angebunden(mann muß ja mal klein anfangen 😉 . Funzt einwandfrei. Anbei mal meine Funktion für das Einfügen eines neuen Datensatz. Jetzt möchte ich das ganze per SQL machen.
    Nur, wie setze ich einen SQL aus VC++ an die DB ab? Mir fehlt irgendwie der Ansatz. Alles was ich versucht habe geht schon beim Compelieren schief.

    void CPdfView::OnNeuerDatensatz() 
    {
    	CRecordset* pSet = OnGetRecordset();
    	if (pSet->CanUpdate() && !pSet->IsDeleted())
    	{		
    		pSet->Edit();
    		if (!UpdateData())
    			return;
    		pSet->Update();
    		{
    			long m_NewID = m_pSet->GetMaxID() +1;
    			m_pSet->AddNew();
    			m_pSet->m_ID = m_NewID;
    			m_pSet->m_PatNr = m_iPatNr;
    			m_pSet->m_DokName = m_sDatName;
    			m_pSet->m_Datum = m_ErzDatum;
    			m_pSet->Update();
    			m_pSet->Requery();
    			m_pSet->MoveLast();
    			UpdateData(FALSE);
    		}
    	}
    }
    

    Wenn´s nicht zu viel ist vielleicht noch ein Tipp wie und wo ich das Ergebniss abfange.

    Gruß Sven



  • http://www.se.fh-heilbronn.de/usefulstuff/VCPLUS6/kap14.htm

    Vor Edit musst du Open aufrufen.
    Update rufst du auf, NACHDEM du das Recordset gefüllt hast.

    Welches Ergebnis willst du abfragen? 🙂



  • Open wird schon beim starten des Programmes aufgerufen.

    pSet->Edit(); 
    if (!UpdateData()) 
        return; 
        pSet->Update(); //Du meinst hier kein Update als müsste ich mit else weiter machen
    else
        { 
                long m_NewID = m_pSet->GetMaxID() +1; 
                m_pSet->AddNew(); 
                m_pSet->m_ID = m_NewID; 
                m_pSet->m_PatNr = m_iPatNr; 
                m_pSet->m_DokName = m_sDatName; 
                m_pSet->m_Datum = m_ErzDatum; 
                m_pSet->Update(); 
                m_pSet->Requery(); 
                m_pSet->MoveLast();
    

    Ich wollte den neuen Datensatz aber per SQL-Befehl in die Datenbank schreiben.
    In der Form etwa:
    INSERT INTO PDF (PatNr, DokName, Datum)
    VALUES ('m_iPatNr', 'm_sDatName', 'm_ErzDatum'),
    ('124', 'Testbrief', '2006-03-26'),
    ('256', 'Befund', '2006-03-12'),
    ('730', 'Sono', '2006-02-24');

    Bzw. eine select Abfrage stellen und das Ergebniss Anzeigen lassen.
    zb:
    select * from pdf where PatNr="m_iPatNr";

    Gruß Sven



  • Ich kann dir nur das erklären, was in groben Zügen hinter dem Link steht.
    Hast du das mal angeschaut?

    Querys kannst du mit einem CDatabase Objekt absetzen.



  • Zum Beispiel so:

    pSet->m_pDatabase->ExecuteSQL("update programme set dummy=0 where dummy = 1");
    

    wobei du natürlich den SQL-Befehl entsprechend anpassen musst.. 😃

    Bei Select geht das über den Paramter m_strFilter von CRecordset; hier kannst du dein Select-Statement aus dem SQL-Befehl unterbringen:
    z.B.

    pSet->m_strFilter = "select * from table where field = 'test'";
    pSet->Requery();
    


  • Ja! VC++ 6 in 21 Tagen. Hab ich schon komplett durch. Hab mir gerade CDatabase mal angeschaut da gibt´s ein ExecuteSQL damit werd ich's mal versuchen.



  • Danke AndRo67

    Funktioniert (fast) einwandfrei.

    pSet->m_pDatabase->ExecuteSQL("INSERT INTO PDF (DokName) VALUES 'm_sDokName'");
    

    trägt mir dummerweise m_sDokName in die DB ein, und nicht den Wert dieser Variablen. Ich hab schon alle möglichen Konstelationen versucht ich brings einfach nicht hin.

    Vielleicht kann mir jemand den entscheidenen Tipp geben.

    Gruß Sven



  • pSet->m_pDatabase->ExecuteSQL("INSERT INTO PDF (DokName) VALUES '" + m_sDokName + "'");
    


  • Oder alternativ

    CString sql;
    sql.Format("INSERT INTO PDF (DokName) VALUES '%s'",m_sDokName);
    pSet->m_pDatabase->ExecuteSQL(sql);
    


  • Danke für die Antworten. Funzt beides.

    Hab mir mal meine Versuche von gestern angesehen, war nah dran hab mich nur bei den vielen '")"); verhauen 😃


Anmelden zum Antworten