![]() |
Datenbank: SQLite • Version: 3 • Zugriff über: ZeosLib
Rückgabewert aus Query auslesen
Ich benutze folgenden SQL-Befehl, um die Anzahl von Datensätzen zu bestimmen:
Code:
Wie kann ich jetzt den Wert auslesen, den die Anfrage zurückgibt. Ich habe es so versucht, bekomme aber immer eine Fehlermeldung: "Listindex überschreitet das Maximum (0)"
SELECT COUNT(*) FROM (SELECT * FROM tblTracks WHERE path = :path);
Delphi-Quellcode:
Wie könnte man es anders lösen?
with ZQuery do begin
// anzahl bestimmen SQL.Clear; SQL.Add('SELECT COUNT(*) FROM (SELECT * FROM tblTracks WHERE path = :path);'); ParamByName('path').AsString := tmp.Strings[i]; ExecSQL; // anzahl prüfen, wenn nicht existiert einfügen if ZQuery.Fields[0].AsInteger = 0 then begin SQL.Clear; SQL.Add('INSERT INTO tblTracks(Artist, Album, Track, Title, Path) VALUES (:artist, :album, :track, :title, :path);'); ParamByName('artist').AsString := id3.Artist; ParamByName('album').AsString := id3.Album; ParamByName('track').AsInteger := strToInt(id3.Track); ParamByName('title').AsString := id3.Title; ParamByName('path').AsString := tmp.Strings[i]; ExecSQL; end; Marcel |
Re: Rückgabewert aus Query auslesen
Was steht denn in tmp.Strings[i]?
[edit] Wieso eigentlich ZQuery abfragen und das Ergebnis von ZQueryPlay auswerten? :gruebel: [/edit] |
Re: Rückgabewert aus Query auslesen
In tmp.Strings sind sämtliche mp3-Dateien eines Ordners mit kompletten Verzeichnis gspeichert. Diese werden in einer Schleifen durchlaufen und überprüft ob sie bereits in der Datenbank vorhanden sind (Count(*) = 1) oder nicht (Count(*) = 0). Also als Beispiel: "D:\Musik\Künstler\Titel.mp3"
Marcel |
Re: Rückgabewert aus Query auslesen
Stimmt ich muss natürlich das Ergebnis von ZQuery testen. Habe den Quelltext geändert. Mit dem Befehl Open; bekomme ich jetzt aber die Fehlermeldung "Database ist locked". Verwende ich ExecSQL kommt die gleiche Fehlermeldung vom Anfang.
Marcel |
Re: Rückgabewert aus Query auslesen
Evtl. so?
Delphi-Quellcode:
with ZQuery do begin
Close; // anzahl bestimmen SQL.Clear; SQL.Add('SELECT COUNT(*) As Anzahl FROM (SELECT * FROM tblTracks WHERE path = :path);'); ParamByName('path').AsString := tmp.Strings[i]; Open; Anzahl := FieldByName('Anzahl').AsInteger; Close; // anzahl prüfen, wenn nicht existiert einfügen if Anzahl = 0 then begin SQL.Clear; SQL.Add('INSERT INTO tblTracks(Artist, Album, Track, Title, Path) VALUES (:artist, :album, :track, :title, :path);'); ParamByName('artist').AsString := id3.Artist; ParamByName('album').AsString := id3.Album; ParamByName('track').AsInteger := strToInt(id3.Track); ParamByName('title').AsString := id3.Title; ParamByName('path').AsString := tmp.Strings[i]; ExecSQL; end; end; |
Re: Rückgabewert aus Query auslesen
Warum die Derived Table?
Warum setzt du die Abfragen immer neu, wenn du schon Parameter verwendest?
Delphi-Quellcode:
ZQuery.Text := 'SELECT Count(*) FROM tblTracks WHERE path = :path;';
ZQuery.Prepare; ZQuery2.Text :=' INSERT INTO tblTracks(Artist, Album, Track, Title, Path) VALUES (:artist, :album, :track, :title, :path);'; ZQuery2.Prepare; for i := 0 to tmp.Count-1 do begin ZQuery.ParamByName('path').AsString := tmp.Strings[i]; Zquery.Open; // anzahl prüfen, wenn nicht existiert einfügen if ZQuery.Fields[0].AsInteger = 0 then begin ZQuery2.ParamByName('artist').AsString := id3.Artist; ZQuery2.ParamByName('album').AsString := id3.Album; ZQuery2. ParamByName('track').AsInteger := strToInt(id3.Track); ZQuery2.ParamByName('title').AsString := id3.Title; ZQuery2.ParamByName('path').AsString := tmp.Strings[i]; ZQuery2.ExecSQL; end; |
Re: Rückgabewert aus Query auslesen
@DeddyH
Funktioniert leider nicht. Fehlermeldung bim Versuch einen neuen Datensatz einzufügen: "Database locked" @mkinzler ZQuery.Prepare und ZQuery.Text gibt es bei den Zeos-Komponenten nicht. Habe es jetzt mal so versucht aber leider ohne Erfolg: "SQL logic error or missing database"
Delphi-Quellcode:
Marcel
procedure TfrmMain.Button1Click(Sender: TObject);
var i: integer; anzahl: integer; source: string; tmp: TStringList; stream: TFileStream; id3: TId3v2Tag; begin tmp := TStringList.Create; id3 := TId3v2Tag.Create; SelectDirectory('Ordner auswählen', '' , source); GetFilesInDirectory(source, '*.mp3', tmp, true, true); ZQuery.SQL.Clear; ZQuery.SQL.Add('SELECT COUNT(*) FROM tblTracks WHERE path = :path);'); ZQueryTmp.SQL.Clear; ZQueryTmp.SQL.Add('INSERT INTO tblTracks(Artist, Album, Track, Title, Path) VALUES (:artist, :album, :track, :title, :path);'); for i := 0 to (tmp.Count - 1) do begin stream := TFileStream.Create(tmp.Strings[i], fmOpenRead); id3.ReadFromStream(stream); ZQuery.ParamByName('path').AsString := tmp.Strings[i]; ZQuery.Open; anzahl := ZQuery.Fields[0].AsInteger; if Anzahl = 0 then begin ZQueryTmp.ParamByName('artist').AsString := id3.Artist; ZQueryTmp.ParamByName('album').AsString := id3.Album; ZQueryTmp.ParamByName('track').AsInteger := strToInt(id3.Track); ZQueryTmp.ParamByName('title').AsString := id3.Title; ZQueryTmp.ParamByName('path').AsString := tmp.Strings[i]; ZQueryTmp.ExecSQL; end; end; end; |
Re: Rückgabewert aus Query auslesen
Durchsuch mal die Dokumentation Deiner DB nach dieser Fehlermeldung. So kann zumindest ich im Moment nur im Dunkeln tappen.
P.S.: Du solltest stream auch wieder freigeben. |
Re: Rückgabewert aus Query auslesen
Hav auch das SQL vergessen
Delphi-Quellcode:
Und .Prepare einfach weglassen
ZQuery.Sql.Text := ...
|
Re: Rückgabewert aus Query auslesen
Zitat:
SQL-Code:
reicht doch allemal.
select count(Path) as Anzahl from tblTracks where path = :path
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:18 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