Daten aus DB holen
-
hi
und zwar, geb ich in einer Maske Datensätze ein und wenn ich auf "Übernehemen" klicke, werden die Daten in der DB gespeichert, nun wenn ich danach auf "Bericht erstellen" klicke soll die Daten aus der DB kommen
WIe muss ich das denn machen?
hab gedacht das geht so
void CSteuerung::GetDaten(CString sReferenzname) { CString strHilfe = ""; strHilfe = "SELECT * FROM Referenzen WHERE Referenzname = '" + sReferenzname +"'";
der Referenzname ist eindeutig, und darf nicht zweimal in der DB vorkommen. Wenn ich den Hab dann weiß ich ja auch die anderen Daten zu dem Versuch
Wenn ich dann die Funktion aufruf
pSt.GetDaten(sReferenzname); dann ist sReferenzname immer """" leer
-
Überprüfe mal ob vor der Übergabe an deine Funktion in der Variable ein Wert enthalten ist...
-
hi
Die VAriabel sReferenzname hat keinen werterst wenn das m_Referenzname.GetWindowText(sReferenzname); schreib wird die Variable befüllt, aber dann kommt der wert ja aus der maske oder?
-
Ja, wenn m_Referenzname ein Textfeld ist kann speicherst du damit den Wert aus dem Feld in der Variable...
Irgendwie versteh ich jetzt net genau wo dein problem liegt???
-
ja so klappts ja auch alles perfekt
Aber so bekomm ich doch nicht die werte aus der DB oder?
-
Nein, du musst vorher noch eine Datenbankabfrage starten und das Ergebnis aufnehmen. Das SQL Statment hast du ja, aber diese musst du auch an die DB schicken!!! Schau mal hier vorbei: http://www.willemer.de/informatik/db/odbcmfc.htm
-
das hab ich schon, habs nur nicht mitgepostet
void CSteuerung::GetDaten(CString sReferenzname) { CString strHilfe = ""; strHilfe = "SELECT * FROM Referenzen WHERE Referenzname = '" + sReferenzname +"'"; //strHilfe = "SELECT TOP 1 * FROM Referenzen ORDER BY VersuchId DESC"; try { if(m_pRs->State == adStateOpen) m_pRs->Close(); m_pRs = NULL; m_piAdoRecordBinding = NULL; m_pRs.CreateInstance(__uuidof(Recordset)); m_strCmdText = _T(strHilfe); pCmd->CommandText = (_bstr_t)m_strCmdText; m_pRs->PutRefSource(pCmd); _variant_t vNull; vNull.vt = VT_ERROR; vNull.scode = DISP_E_PARAMNOTFOUND; m_pRs->Open(vNull, vNull, adOpenDynamic, adLockOptimistic,adCmdUnknown); if(FAILED(m_pRs->QueryInterface(__uuidof(IADORecordBinding),(LPVOID*)&m_piAdoRecordBinding))) _com_issue_error(E_NOINTERFACE); m_piAdoRecordBinding->BindToRecordset(&m_rsRecSet); } // Fehler vorhanden? catch (_com_error &e) { // Fehlermeldung generieren GenerateError(e.Error(), e.Description()); } }
-
Dann solltest du mit MoveNext() den nächsten Datensatz auslesen können.
Hab dies noch nie so wie du es gemacht hast gesehen (bin ja aber auch Noob). Hab bis jetzt immer nur ne klasse von CRecordSet abgeleitet (oder direct ODBC genutzt) und dies ging dann zumindest so.
-
wie meinst du das mit movenext?
Warum eigentlich movenext, müsst doch movefirst sein oder
-
hat sich erledigt
geht so wie oben beschrieben und mit der MoveFirst Anweisung
danke
-
Du solltest dich mit SQL und den Grund lagen der Programmmierung beschäftigen.
Wenn sReferenzname leer ist dann kannst du auch nicht erwarten das
SELECT * FROM Referenzen WHERE Referenzname = '' eine Ergebnismenge für dich hat.
Zumindest solange nicht Referenzname leer ist.
-
ich weiß
habs ja dann so gemacht , dass es funktioniert
Ich brauch halt immer den Referenznamne (m_Referenzname.GetWindowText(sReferenzname);), dann bekomm ich auch immer die anderen Werte aus der DB
-
OK.
Mit MoveNext() gehst du ebenfalls wenn du am anfang stehst und noch keine Daten abgerufen hast auch auf den ersten Datensatz. Mit MoveFirst() springst du immer zum ersten Datensatz...
-
Mit MoveFirst() springst du immer zum ersten Datensatz...
dass stimmt, aber weil ich immer einen eindeutigen Refnamen hab (der nur einmal vorkommt) passts
-
Der Fehler (wenn ichs richtig verstanden habe) liegt daran, dass es nicht funktioniert, wenn du in dein SQL-Statement eine WHERE Klausel einfügst. Du musst das mit einem Filter machen (m_strFilter). Schau dir das passende in der MSDN an: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_mfc_crecordset.3a3a.m_strfilter.asp