Experten: Datenbanken - CRecordset, wie dynamisch Feldern Werte zuweisen?



  • Hm, super 😉

    Was haltet ihr davon...man muss sich ja behelfen 🙂

    Ich kann über CDatabase::ExecuteSQL Datensätze einfügen.

    Jetzt bastel ich mir einfach eine von CRecordset abgeleitete Klasse. Diese kennt die Funktion SetFieldValue. Sie hat ein member CString sqlquery. Bei CMyRecordset::AddNew(CString table) wird dieser string auf "INSERT INTO "+table + " "; gesetzt.

    Dann hat er noch die member CString fields und values.
    Diese werden bei AddNew auf "(" gesetzt.

    Dann gibts die klasse Funktion SetFieldValue(CString field, CString value);

    Nun wird bei Aufruf dieser Klasse fields zu fields+field+",".
    und values zu values+value+",".

    Dann gibts noch die Funktion Update von mir.
    Diese nimmt das letzte "," aus den 2 Variablen und beendet den String mit ")".
    dann haben wir folgende 3 Variablen nach den Aufrufen:

    AddNew("meinetabelle"); => sqlquery = "INSERT INTO meinetabelle ";
    SetFieldValue("Mein Feld", "Mein Wert") => "(Mein Feld," und "(Mein Wert".
    Update(CDatabase) => "(Mein Feld)" und "(Mein Wert)".

    Das ganze wird zusammengesetzt zu

    "INSERT INTO meinetabelle (Mein Feld) VALUES (Mein Wert)".

    Dieser String wird dann an CDatabase übergeben.....na, genial oder genial? 😉

    Kevin



  • das klappt aber nur solange wie du nur INSERT machen willst^^
    Oder weist du einen weg wie man direkt mit der Klasse CRecorset ohne Ableitung an die Daten eines SELECT-Befehls herankommt? Einfach Open mit Tabellenname und dann getValue klappt da jedenfalls nicht



  • nicht? bei mir schon 🙂



  • im ernst?
    kannst mal Codeauszüge posten? Bei mir gabs beim Open immer Exceptions das keine Verbinung zu den Inhalten besteht oder so ein Rotz ...



  • Funktioniert einwandfrei:

    void CMySQLTestDlg::OnBnClickedButton1()
    {
    CDatabase db;
    CString subject;
    CString ODBC;
    CString driver;
    driver = "MySQL ODBC 3.51 Driver";
    CString sql ;
    sql.Format ( "DRIVER={%s};SERVER=127.0.0.1;DATABASE=cpp;UID=root;PASSWORD=pw;READONLY=FALSE;", driver) ;
    db.OpenEx(sql,CDatabase::noOdbcDialog); 
    if (!db.IsOpen()){ AfxMessageBox("Fehler beim Verbinden");
    }else{ 
    CRecordset rs( &db);
    rs.Open(rs.snapshot, _T("SELECT * FROM testtable"));
    
    while(!rs.IsEOF())
    {
    	CString sValue;
    	rs.GetFieldValue(0, sValue);	
    	MessageBox(sValue);
    	rs.Delete();
    	rs.MoveNext();
    }
    
    rs.Close();
    }db.Close();
    }
    


  • erstmal thx,
    vielleicht liegts ja daran das ich Open und nicht OpenEx benutz habe, na mal sehen 🙂



  • Vorsicht, mit OpenEx hatte ich noch ungeklärte Probleme: http://www.c-plusplus.net/forum/viewtopic-var-t-is-116639.html



  • hast du eine lösung dafür gefunden?



  • Nur die, die ich auch gepostet habe. 😞
    Und das Erstellen der Datenquelle mache ich momentan wieder von Hand, das funktioniert wenigstens. 🙄



  • kann ich mal bitte den Src sehen?



  • sagt mal was ist die Kombi CDatabase/CRecordset für ein unflexibler Müll? CRecordset kennt kein SetFieldValue...ok schlimm genug, aber umgehbar.

    Jetzt kennt es GetFieldValue, aber NICHT GetFieldCount...was soll das denn bitte?

    soll ich while(1){
    if(!GetFieldInfo(n))
    break;

    n++;
    }

    o.ä. machen oder was? Kennt ihr eine Möglichkeit oder das dazugehörige SQL-Statement, wenns CRecordset schon nicht kann?

    Danke,
    Gruß,
    Kevin

    //EDIT:

    Wer lesen kann ist klar im Vorteil:
    GetODBCFieldCount 🙄



  • @Surkevin: Schau in den verlinkten Post, Seite 3. 🙂
    Oder soll ich es dir herkopieren?



  • 😃 🤡



  • wer benutzt von euch ein mapping um werte in die tabelle zu bringen bzw upzudaten?

    also ich finde db_mapping sehr gut


Anmelden zum Antworten