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.

in Datenbank schreiben geht nicht

Empfohlene Antworten

Veröffentlicht

Hallo zusammen!!

ist zwar Wochenende, aber ich hoffe, ein paar von Euch sind auch jetzt anwesend und können mir helfen.

Ich hab ein Projekt, bei dem eine Access 2000 Datenbank automatisch mit Informationen von MP3-Dateien auf der Festplatte gefüllt werden soll.

Dazu scanne ich die Platte, lese die MP3-Tags aus und fülle nach ein paar Plausibilitätsprüfungen die Datenbank. Es gibt 3 relevante Tabellen und 1 Abfrage. In die Tabellen trage ich nach jedem Dateiscan die Infos über Interpret, Titel und Album ein und merke mir den dazugehörenden Schlüssel. Diese möchte ich dann im Anschluss in die Abfrage schreiben, in der die restlichen Infos über die Datei eingetragen werden.

Das Problem ist jetzt, dass beim Schreiben in die Abfrage folgende Fehlermeldung erscheint:

„Das Microsoft Jet-Datenbankmodul kann in der Tabelle „Titel“ keinen Datensatz mit passenden Schlüsselfeldern „IDTitel“ finden“

Wahlweise kann der Fehler auch für die Interpreten- oder Album-Tabelle auftauchen.

Der Eintrag in den Tabellen besteht allerdings.

Wenn ich das Programm im Debug-Modus schrittweise durchlaufen lasse, funktioniert es einwandfrei.

Hat einer von Euch Ahnung, woran das liegen kann?

Wäre nett, wenn Ihr Euch trotz Wochenende mal den Quellcode anseht, denn Dienstag ist Abgabetermin.

Ach ja: programmiert wird mit Visual C++ 6.0

Quellcode:


void CDlgScan::FillDB(CString path, CMP3VerwaltungSet *m_pSet, CInterpretTeil *m_pSetInterpret, CTitelTeil *m_pSetTitel, CAlbumTeil *m_pSetAlbum)

{

	// verwendete Variablen:

	// Position des letzten Backslashes im Pfad

	// Kennzeichen, ob in den ID3-Tags ein Interpret, Titel gefunden wurde

	// Kennzeichen, ob der Datensatz korrekt oder bestaetigt ist

	// ID des Interpreten, Titel, Album in der Teiltabelle

	// Kennzeichen, ob in den Teiltabellen ein Interpret, Titel gefunden wurde

	// Strings mit den Informationen über Dateiname, Interpret, Titel, Album

	int stelleBS, gefInt, gefTit, korrektDS = 0, bestaetigtDS = 0, intID = 0, titID= 0, albID = 0, gefIntTeil = 0, gefTitTeil = 0;

	CString filename, interpret, titel, album;


	// Objekt der Klasse CTagEdit, um die ID3-Tags der Datei zu bearbeiten

	CTagEdit tag;


	// Tags auslesen

	tag.lesen(path);


	// kopieren der Tags Artist, Titel und Album in die Stringvariablen

	interpret.Format("%s", tag.inhalt.artist);

	titel.Format("%s", tag.inhalt.songname);

	album.Format("%s", tag.inhalt.album);


	// abschneiden der überflüssigen Leerzeichen rechts am String

	interpret.TrimRight(' ');

	titel.TrimRight(' ');

	album.TrimRight(' ');


	// feststellen der Postition des letzten Backslashes vor dem Dateinamen

	stelleBS = path.ReverseFind('\\');


	// kopieren des Dateinamens in die Stringvariable

	filename = path.Right(path.GetLength() - stelleBS - 1);


	// wenn im Tag Interpret und Titel dasselbe steht wie im Dateinamen, wird der Datensatz als korrekt gekennzeichnet

	gefInt = filename.Find(interpret);

	gefTit = filename.Find(titel);


	if((gefInt != -1) && (gefTit != -1))

	{

		korrektDS = -1;

	}


	// durchgehen der Interpretentabelle, um zu sehen, ob der Interpret schon bekannt ist

	if(!m_pSetInterpret->IsEOF())

	{

		m_pSetInterpret->MoveFirst();

	}


	while(!m_pSetInterpret->IsEOF())

	{

		if(m_pSetInterpret->m_Interpret == interpret)

		{

			// ist der Interpret in der Tabelle vorhanden, wird die ID in die Variable geschrieben und das Satzkennzeichen "gefIntTeil" auf -1 ( = TRUE) gesetzt

			intID = m_pSetInterpret->m_IDInterpretT;

			gefIntTeil = -1;

		}


		m_pSetInterpret->MoveNext();

	}


	// wenn der Interpret noch nicht in der Tabelle steht, wird er angefügt, und die ID in die Variable "intID" geschrieben

	if(!intID)

	{

		if(tag.inhalt.artist[0] == -52)

		{

			// ist das Interpreten - Tag leer, bekommt der Eintrag den Interpreten 1 ( = "unknown")

			intID = 1;

		}

		else

		{

			m_pSetInterpret->AddNew();

			m_pSetInterpret->m_Interpret = interpret;

			m_pSetInterpret->m_best_tigtIntT = 0;


			m_pSetInterpret->Update();


			m_pSetInterpret->Requery();


			m_pSetInterpret->MoveLast();


			intID = m_pSetInterpret->m_IDInterpretT;

		}

	}


	// selbes Vorgehen wie bei Interpret

	if(!m_pSetTitel->IsEOF())

	{

		m_pSetTitel->MoveFirst();

	}


	while(!m_pSetTitel->IsEOF())

	{

		if(m_pSetTitel->m_Titel == titel)

		{

			titID = m_pSetTitel->m_IDTitelT;

			gefTitTeil = -1;

		}


		m_pSetTitel->MoveNext();

	}


	if(!titID)

	{

		if(tag.inhalt.songname[0] == -52)

		{

			titID = 1;

		}

		else

		{

			m_pSetTitel->AddNew();

			m_pSetTitel->m_Titel = titel;

			m_pSetTitel->m_best_tigtTitT = 0;


			m_pSetTitel->Update();


			m_pSetTitel->Requery();


			m_pSetTitel->MoveLast();


			titID = m_pSetTitel->m_IDTitelT;

		}

	}


	// Wenn die Variablen "gefIntTeil" und "gefTitTeil" ungleich 0 sind ( ==> TRUE), wird der Datensatzals "bestätigt" gekennzeichnet

	if(gefIntTeil && gefTitTeil)

	{

		bestaetigtDS = -1;

	}


	// selbes Vorgehen wie bei Interpret und Titel

	if(!m_pSetAlbum->IsEOF())

	{

		m_pSetAlbum->MoveFirst();

	}


	while(!m_pSetAlbum->IsEOF())

	{

		if(m_pSetAlbum->m_Album == album)

		{

			albID = m_pSetAlbum->m_IDAlbumT;

		}


		m_pSetAlbum->MoveNext();

	}


	if(!albID)

	{

		if(tag.inhalt.album[0] == -52)

		{

			albID = 1;

		}

		else

		{

			m_pSetAlbum->AddNew();

			m_pSetAlbum->m_Album = album;

			m_pSetAlbum->m_best_tigtAlbT = 0;


			m_pSetAlbum->Update();


			m_pSetAlbum->Requery();


			m_pSetAlbum->MoveLast();


			albID = m_pSetAlbum->m_IDAlbumT;

		}

	}


	// ein neuer Datensatz wird in der "qryMain" angelegt, mit den Informationen aus den Tags und aus den Kontrollen während der vorhergehenden Methode

	// hier steigt das Programm aus!!

	m_pSet->AddNew();


	m_pSet->m_Pfad = path;

	m_pSet->m_IDInterpretH = intID;

	m_pSet->m_IDTitelH = titID;

	m_pSet->m_IDAlbumH = albID;

	m_pSet->m_TrackNr = "0";

	m_pSet->m_Genre = tag.inhalt.genre;

	m_pSet->m_Tanz = "unknown";

	m_pSet->m_neu = -1;

	m_pSet->m_korrekt = korrektDS;

	m_pSet->m_bestaetigt = bestaetigtDS;

	m_pSet->m_loeschen = 0;


	m_pSet->Update();


	m_pSet->Requery();

}

Euer k.o.b

Hallo zusammen,

schade, dass keiner von Euch draufgekommen ist. Zum Glück wusste mein Dozent eine Lösung.

Für alle, die es interessiert:

In Access haben wir bei den Beziehungseingenschaften geändert, dass die Beziehung alle Datensätze aus "Haupt" und nur die Datensätze aus "Interpret" enthält, bei denen die Inhalte der verknüpften Felder beider Tabellen gleich sind.

Somit macht es nichts mehr aus, wie langsam das Datenbankmanagementsystem arbeitet, und das Programm läuft durch.

Schönen Tag noch,

k.o.b

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

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.