CRecordset und Update erzeugen Fehlermeldung

Baron Sengir

Mitglied
Hallo Ihr Lieben,

ich programmiere gerade eine kleine Anwendung, die per ODBC auf eine Access-DB zugreifen soll. Das ganze unter VC++ 6 mit MFC. Alles funktioniert bislang sehr gut: Daten ergänzen, erstellen oder abfragen oder oder oder

Nur, wenn ich einen Datensatz verändern möchte klappt's nicht.

Mein Code, der mir Probleme bereitet, schaut folgendermaßen aus:
Code:
void CTdjView::markTitelPlayed(long titelID)
{
	if (titelID!=0)
	{
		CTitel Suche;
		CString temp,tmp;

		temp.Format( "%d", titelID );
		Suche.m_strFilter=" [t_TITEL].[id-titel]="+temp;
		Suche.Open();
		if (Suche.CanUpdate())
		{
			Suche.MoveFirst();
			Suche.Edit();
			Suche.m_gespielt = true;
			Suche.Update();
		}
		Suche.Close();
	}
}

Wenn ich die MSDN richtig verstanden habe, sollte alles richtig sein. Trotzdem erzeugt der Code eine Fehlermeldung: "Es werden keine Zeilen von der Aktuallisierungs- oder Löschoperation betroffen." :suspekt:

Nichts passiert. Ich weiß aber genau, dass ich auf den richtigen Datensatz zeige. Letzendlich solll nur Suche.m_gespielt von eigenlich false auf true gesetzt werden und gut ist.

Könnt Ihr mir helfen, wo mein Denkfehler ist? :confused:

LG
Markus
 
Ändert das Suche.MoveFirst(); nicht den Zeiger auf die Daten?

Du müsstest den Aufruf zu MoveFirst doch direkt weglassen können. Nach dem Open hat er ja schon den gesuchten Eintrag drin.
 
Hi,
änder die Zeile
Code:
temp.Format( "%d", titelID );
in
Code:
temp.Format( " '%d' ", titelID );

müsste dann tuen.

Gruss.
 
Hi,

@fraglib: Werde ich mal testen... Danke für den Tipp.

Ich habe gestern zufällig eine Lösung gefunden, die zwar vom Code her nicht wirklich schön ist, aber sie funktioniert. Vielleicht kann ja jemand damit was anfangen. Ich verstehe noch nicht so genau, warum das jetzt funktioniert und zuvor die Lösungen nicht, aber vielleicht muss ich das ja auch nicht... :(

Folgendes funktioniert:

Code:
void CTdjView::markTitelPlayed(long titelID)
{
	if (titelID!=0)
	{
		CTitel Suche, Ak;
		CString temp, tmp;
		CString bew, inter, pfad, titel;
		long cd, idtitel, klasse, dance;
		CTime dauer;
		int gespielt;
		int minuten, sekunden;
		BYTE tpm, track;

		temp.Format( "%d", titelID );
		Suche.m_strFilter=" [t_TITEL].[id-titel]="+temp;
		Suche.Open();
		Suche.MoveFirst();

		bew      = Suche.m_bewertung;
		cd       = Suche.m_cd;
		dauer    = Suche.m_dauer;
		gespielt = Suche.m_gespielt;
		idtitel  = Suche.m_id_titel;
		inter    = Suche.m_interpret;
		klasse   = Suche.m_klasse;
		minuten  = Suche.m_min;
		pfad     = Suche.m_pfad;
		sekunden = Suche.m_sec;
		dance    = Suche.m_tanz;
		titel    = Suche.m_titel;
		tpm      = Suche.m_tpm;
		track    = Suche.m_track;

		Suche.Close();

		tmp.Format("SELECT t_TITEL.*, t_TITEL.[id-titel] FROM t_TITEL WHERE (((t_TITEL.[id-titel])=%d))",titelID);
		Ak.Open( CRecordset::dynaset, _T( tmp ));
		if (Ak.CanUpdate())
		{
			Ak.Edit();
			
			Ak.m_bewertung = bew;
			Ak.m_cd        = cd;
			Ak.m_dauer     = dauer;
			Ak.m_gespielt  = true;
			Ak.m_interpret = inter;
			Ak.m_klasse    = klasse;
			Ak.m_min       = minuten;
			Ak.m_pfad      = pfad;
			Ak.m_sec       = sekunden;
			Ak.m_tanz      = dance;
			Ak.m_titel     = titel;
			Ak.m_tpm       = tpm;
			Ak.m_track     = track;

			Ak.Update();
		}
		Ak.Close();
	}
}

Liebe Grüße

Markus
 
Zurück