Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

Mein Problem ist bestimmt ganz einfach ^^

Ich habe ein Recordset das mit Daten einer Mysql DB gefüttert wird. Funktioniert soweit wunderbar nur wenn ich das RS via Edit() ändern möchte geht nichts da ich nicht auf die member variablen bzw felddatenelemente zugreifen kann. für hilfe wäre ich offen hier ist der code:


void CBuildings::OnButtonBuild() 

{

	UpdateData(TRUE);

	CDatabase db;


	db.Open("mysql",FALSE,FALSE,_T("cplusplus;c++"));

/*	

	Ist die bessere Methode funktioniert aber nicht

	db.OpenEx(_T("mysq;cplusplus;c++"),CDatabase::noOdbcDialog);

*/	

	CRecordset rs(&db);

	CString Wert;

	rs.Open(  CRecordset::forwardOnly, _T( "SELECT * FROM `user` WHERE `user_id`= 1"));

   int n = rs.GetODBCFieldCount();


   CString DatenArray[8];

   //wenn IsEof 0 zurück gibt dann gehe weiter in der anweisung denn dann is

   //data da also login funzt



	if( !rs.IsEOF() )

	{

			while( !rs.IsEOF() ) 

		{

			  for( int i = 0; i < n; i++ ) 

			  {

				 rs.GetFieldValue( i, Wert );

				 DatenArray[i]=Wert;

			  }

		rs.MoveNext( );


		}

	}


	rs.Edit();

	/*

        hier hab ich an sowas gedacht:

        rs.m_user_rohstoff1=100;

        rs.user_rohstoff1=100;


	*/


	rs.Update();







   UpdateData(FALSE);

   rs.Close();



   db.Close();


}


Hier werden die member variablen festgelegt auf die ich via edit keinen zugriff habe:(
class CDbtest4Set : public CRecordset

{

public:

	CDbtest4Set(CDatabase* pDatabase = NULL);

	DECLARE_DYNAMIC(CDbtest4Set)


// Field/Param Data

	//{{AFX_FIELD(CDbtest4Set, CRecordset)

	long	m_buildings_id;

	CString	m_buildings_name;

	long	m_buildings_rohstoff1;

	long	m_buildings_rohstoff2;

	long	m_user_id;

	CString	m_user_nick;

	CString	m_user_pass;

	CString	m_user_email;

	CString	m_user_country;

	CString	m_user_fraktion;

	long	m_user_rohstoff1;

	long	m_user_rohstoff2;

	//}}AFX_FIELD

eigentlich nur einen wenn du nett bist zeigst du mir aber beide möglichkeiten auf _P

eigentlich nur einen
Und welchen? Was du bisher machst, sieht so aus: Du gehst alle Datensätze durch, und nach dem letzten versuchst du, einen Datensatz zu ändern, der nicht da ist.

wenn du nett bist zeigst du mir aber beide möglichkeiten auf _P
Um alle Datensätze zu ändern, solltest du das in der while-Schleife machen. Hier wäre es aber wohl effektiver, gleich ein UPDATE-Statement abzusetzen.

wenn ich rs movenext rausnehme dann gibtarbeitet er ja theoretisch im aktuellen.

nur mein problem ist ich will auf ein einzelnes datenfeld zugreifen was rohstoffe1 heißt und nur dies will ich ändern aber ich hab da einfach keinen zugriff drauf :confused:

wenn ich rs movenext rausnehme dann gibtarbeitet er ja theoretisch im aktuellen.
Und wenn du MoveNext so lässt, gehst du solange durch die Datensätze, bis es keinen "aktuellen" mehr gibt. Ich frage nochmal: Welchen Datensatz willst du ändern?

nur mein problem ist ich will auf ein einzelnes datenfeld zugreifen was rohstoffe1 heißt und nur dies will ich ändern aber ich hab da einfach keinen zugriff drauf :confused:
Wie äußert sich das denn? Bekommst du eine Fehlermeldung, oder passiert einfach nichts? Letzteres ist wie gesagt kein Wunder, weil du hinter dem letzten Datensatz stehst. Da gibt es nichts zu ändern.

Okay habs geschnallt danke :P

Ich hol mir jetzt die gewünschten sachen per GetFieldValue raus und normalerweise müsste man die felder dann ja auch per SetFieldValue bearbeiten können. Nur sagt mein compiler SetFieldValue ist keine Recordset Funktion see the definition of Recordset

Ich hol mir jetzt die gewünschten sachen per GetFieldValue raus und normalerweise müsste man die felder dann ja auch per SetFieldValue bearbeiten können.
Nö. SetFieldValue gibt es nicht.

Dafür kann man Klassen von CRecordset ableiten. Das hast du ja auch getan: Du hast die Klasse CDbtest4Set. Nur leider benutzt du sie nicht.

ich komm mir grad irgendwie dumm vor. was heißt ich benutze sie nicht ? und warum kann ich auf die funktion open zugreifen wenn ich die CDbtest4Set nicht nutze. sag mir mal bitte konkret wie ich die funktion nutze und wie ich nen datenfeld zb rohstoff1(id 6) ändern kann. danke :P

was heißt ich benutze sie nicht ?

In deiner Methode CBuildings::OnButtonBuild erstellst du eine Instanz von CRecordset, nicht von CDbtest4Set. Ist also logisch, dass du so nicht auf die Datenmember von CDbtest4Set zugreifen kannst, ein SQL Statement angeben musst und dich mit GetFieldValue abmühen musst.

sag mir mal bitte konkret wie ich die funktion nutze und wie ich nen datenfeld zb rohstoff1(id 6) ändern kann. danke :P

- Instanz von CDbtest4Set erstellen und öffnen

- Zum zu ändernden Datensatz navigieren

- Edit

- Datenmember den neuen Wert zuweisen

- Update

So ich benutze nun die CDbtest4Set , danke für den Tipp. Ich Navigiere via rs.Open("Select * from user where userid=1"); funktioniert ganz gut.

Nun hab ich ja den Cursor auf dem Ergebnis der Sql Abfrage. Wenn ich jetzt was ändern will mach ic h das so:

rs.Edit();

rs.m_user_rohstoff1=222;

rs.Update();

Er Updated das aber nicht in der Database der Wert ist immer der selbe wie vorher ? Das komische ist ja das mir Update() 1 zurückliefert also erfolgreich geupdatet. ich hab es schon versucht mit db.BeginTrans und db.CommitTrans funzt auch nicht, hilfö.

CRecordset::forwardOnly ist readonly, wie willst du damit ein update machen, hm?

s'Amstel

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.