![]() |
Datenbank: Access • Version: 2003 • Zugriff über: ADO
Buchstabensalat in Access-Tabelle
Hallo,
in meinem Programm lese ich MP3-Dateien aus einem Folder und schreibe sie untereinander in eine ListBox. Danach ermittle ich für jede MP3-Datei die ID3-Tags, und zwar mit dem Code den man unter ![]() Was ich nun tun will, ist für jede Datei einen Eintrag in einer Tabelle einer Access-Datenbank anzulegen. Die DB und die Tabelle habe ich in Access selbst kreiert. Ich greife mit einer ADOConnection auf die Datenbank zu. Mittels ADOQuery und folgendem Code fülle ich dann die Tabelle namens 'tblID3':
Delphi-Quellcode:
An und für sich funktioniert dies auch prächtig, NUR nicht jedesmal. Wenn ich jetzt mehrere MP3's in die Listbox schreiben lasse und dann bei einer nach der anderen die ID3-Tags auslese und sie dann in die Tabelle schreibe, habe ich bei vielen Einträgen nur Buchstabensalat... z.B. nur "UUUUUU" bei Stringfeldern oder "aaaaaaaaa".
for I := 0 to lbResults.Count - 1 do
begin Read_ID3Tag(lbResults.Items[I]); //hier lese ich die ID3-Tags aus ADOQuery1.SQL.Text := 'SELECT * FROM '+'tblID3'+' WHERE 0=1'; ADOQuery1.Open; ADOQuery1.Append; ADOQuery1['ListID'] := I; ADOQuery1['ID'] := ID3Tag.ID; ADOQuery1['Title'] := ID3Tag.Title; ADOQuery1['Artist'] := ID3Tag.Artist; ADOQuery1['Album'] := ID3Tag.Album; ADOQuery1['Year'] := ID3Tag.Year; ADOQuery1['Comment'] := ID3Tag.Comment; ADOQuery1['Genre'] := ID3Tag.Genre; ADOQuery1['Sample'] := ID3Tag.Sample; ADOQuery1['Length'] := ID3Tag.Length; ADOQuery1['Bits'] := ID3Tag.Bits; ADOQuery1['Vers'] := ID3Tag.Vers; ADOQuery1['Layers'] := ID3Tag.Layers; ADOQuery1.Post; end; Auffällig ist, dass es jedesmal bei den gleichen Files auftritt. Also dachte ich natürlich gleich "Fehler beim Auslesen der ID3-Tags". Allerdings habe ich den Code von ![]() ![]() Demzufolge glaube ich daran, dass ein Fehler beim Einfügen der Daten in die Tabelle unterläuft. Ist es vielleicht irgendeine Einstellung bei der ADOQuery-Komponente oder bei der ADOConnection? Ich hab' mich ehrlich gesagt noch nicht soviel mit DB's in Delphi beschäftigt und bin deshalb auf dem Gebiet recht unerfahren, weswegen ich denke, dass ich ja irgendeine Kleinigkeit übersehen haben könnte. Achja, was vielleicht noch wichtig ist: Ich bekomme beim Ausführen meines Programmes, sobald ich beginne, die Werte in die DB zu schreiben, die Compilermeldung "Der schreibgeschützte Eigenschaftswert wurde nicht festgelegt". Ich kann dann allerdings auf "Continue" drücken und das Programm läuft ohne Problem weiter - bis halt eben diesen Buchstabensalat bei manchen Einträgen ausgenommen. Kann diese Meldung evtl. auf das eigentliche Problem hinweisen? Ich hoffe ja jetzt dass es sich nur um einen typischen Anfängerfehler handelt - dann wird's nämlich recht leicht zu beseitigen sein *gg* In dem Sinne bin ich auf eure Antworten gespannt. Grüße, Sicho |
Re: Buchstabensalat in Access-Tabelle
Ich würde das Einfügen in die Access-Tabelle anders machen. Zum Einfügen eignet sich INSERT besser. Da immer das gleiche Statement ausgeführt wird, bieten sich auch Parameter an:
Delphi-Quellcode:
ADOQuery1.SQL.Text := 'insert into tblID3 values( :lid, :id, :title, :artist, ...)';
for I := 0 to lbResults.Count - 1 do begin Read_ID3Tag(lbResults.Items[I]); //hier lese ich die ID3-Tags aus ADOQuery1.Open; ADOQuery1.Append; ADOQuery1.Parameters.ParamByName('lid').Value:= I; ADOQuery1.Parameters.ParamByName('ID').Value := ID3Tag.ID; .... ADOQuery1.ExecSql; end; |
Re: Buchstabensalat in Access-Tabelle
Wenn ich den Code wie von dir angegeben umschreibe, bekomme ich bei der Ausführung folgende Fehlermeldung:
Ein Parameterobjekt ist nicht ordnungsgemäß definiert. Inkonsistente oder unvollständige Informationen wurden angegeben. Tippfehler sind keine drin. Hab' ich was übersehen? |
Re: Buchstabensalat in Access-Tabelle
Mein Code war ja verkürzt. Poste nochmal den ganzen abgeänderten Block.
|
Re: Buchstabensalat in Access-Tabelle
Delphi-Quellcode:
ADOQuery1.SQL.Text := 'insert into tblID3 values (:ListID, :ID, :Title, :Artist,'+
':Album, :Year, :Comment, :Genre, :Sample, :Length, :Bits, :Vers,'+ ' :Layers)'; for I := 0 to lbResults.Count - 1 do begin Read_ID3Tag(lbResults.Items[I]); //hier lese ich die ID3-Tags aus ADOQuery1.Open; ADOQuery1.Append; ADOQuery1.Parameters.ParamByName('ListID').Value:= I; ADOQuery1.Parameters.ParamByName('ID').Value := ID3Tag.ID; ADOQuery1.Parameters.ParamByName('Title').Value := ID3Tag.Title; ADOQuery1.Parameters.ParamByName('Artist').Value := ID3Tag.Artist; ADOQuery1.Parameters.ParamByName('Album').Value := ID3Tag.Album; ADOQuery1.Parameters.ParamByName('Year').Value := ID3Tag.Year; ADOQuery1.Parameters.ParamByName('Comment').Value := ID3Tag.Comment; ADOQuery1.Parameters.ParamByName('Genre').Value := ID3Tag.Genre; ADOQuery1.Parameters.ParamByName('Sample').Value := ID3Tag.Sample; ADOQuery1.Parameters.ParamByName('Length').Value := ID3Tag.Length; ADOQuery1.Parameters.ParamByName('Bits').Value := ID3Tag.Bits; ADOQuery1.Parameters.ParamByName('Vers').Value := ID3Tag.Vers; ADOQuery1.Parameters.ParamByName('Layers').Value := ID3Tag.Layers; ADOQuery1.ExecSql; end; |
Re: Buchstabensalat in Access-Tabelle
.Open und .Append sind natürlich überflüssig. U.U. muß man die Paramter, die standardmäßig Varianten sind auch einen Typ mitgeben z.b. .asString statt .Value.
|
Re: Buchstabensalat in Access-Tabelle
Erstmal danke für den Vorschlag.
Die "schreibgeschützte Eigenschaftswert"-Meldung taucht nun nicht mehr auf. Am Buchstabensalat in der Tabelle ändert es allerdings nichts. Also doch ein Fehler beim ID3-Tags auslesen? (ist haargenau der gleiche Code wie im ersten Posting verlinkt, nur dass aus "dauer" bei mir "Length" wurde) Oder passiert beim Schreiben in die Tabelle irgendeine Dummheit, die nicht beachtet wurde? |
Re: Buchstabensalat in Access-Tabelle
Hast du dir die Werte schonmal im Debugger angesehen?
|
Re: Buchstabensalat in Access-Tabelle
Mist, hätt' ich eher machen sollen *gg*
Die Werte stehen schon im ID3Tag record falsch... also liest er sie so aus den MP3-Files. Damit kann ja schon mal ein Fehler beim Schreiben der Tabelle ausgeschlossen werden. Nun wär es halt noch intressant zu wissen warum er z.B. "aaaaaaaaaaaa" statt den richtigen Wert von "Artist" ausliest. Die ID3-Tags der Files selbst sind alle richtig gesetzt, da steht nirgends "aaaaaa" oder ähnliches drin, sondern nur "echte" Werte. Mal sehen ob ich im Read_ID3Tag-Code 'nen Fehler finde... |
Re: Buchstabensalat in Access-Tabelle
![]() Die Zusatzinformationen werden in einem Block vor oder nach den Audio Daten (dem MPEG-Stream) in die Datei eingefügt. Den Beginn eines ID3-Blockes erkennt man anhand des Headers (Version ID3v2) Leider kann find' ich im praktisch unkommentiertem Code von ![]() Wenn er nämlich nur eines der beiden macht, ist es klar, dass er manchmal falsche Daten ausliest, was dann mein Problem erklären würde. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz