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