kingofbrain Geschrieben 4. Mai 2002 Teilen Geschrieben 4. Mai 2002 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kingofbrain Geschrieben 7. Mai 2002 Autor Teilen Geschrieben 7. Mai 2002 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.