Zum Inhalt springen

in Datenbank schreiben geht nicht


Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...