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



  • Hallo!

    Wie kann ich, wenn ich im CRecordset einen Datensatz (einer MYSQL Datenbank) habe, ein Feld ändern?

    Ich kann nicht eine von CRecordset abgeleitete Klasse erstellen, und die Felder als Membervariablen deklarieren, um sie per Update hineinzuschreiben, da ich in dem Programm sehr viele Tabellen habe.

    Meine Recordsetklasse muss auf JEDE Tabelle passen.

    Das Programm lief vorher auf Accessdatenbanken über CDaoRecordset...da gab es die nützliche Funktion SetFieldValue..allerdings gibts die schlauerweise nicht mehr, nur noch GetFieldValue.

    Und immer ein SQL-Query ausführen möchte ich auch nicht unbedingt....gibt es da keine einfache Möglichkeit?

    Gruß,
    Kevin

    P.S.:
    Wie wäre es am geschicktesten dieses Projekt von Access auf MySQL umzuändern wenn es auf CDaoDatabase/Recordset basiert? Ich habe gelesen, dass diese beiden Klassen mit mysql extrem langsam sind und dachte daher an CDatabase/Recordset....was würdet ihr sagen?



  • Ich kann dir (leider^^)nur sagen was nicht funktioniert: einfach CRecordset benutzen und dort mit Open das entsprechende Statement rein. Hat bei mir leider nicht gefunzt, obwohl ich das auch gern hätte.
    Wenn du nur updaten willst, dann geht es wirklich noch am einfachsten per CDatabase ein SQL-Statement abzusetzen, wie du schon abgedeutet hast.



  • 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