Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Rückgabewert aus Query auslesen (https://www.delphipraxis.net/106507-rueckgabewert-aus-query-auslesen.html)

holle 11. Jan 2008 20:53

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:
SELECT COUNT(*) FROM (SELECT * FROM tblTracks WHERE path = :path);
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)"
Delphi-Quellcode:
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;
Wie könnte man es anders lösen?

Marcel

DeddyH 11. Jan 2008 20:58

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]

holle 11. Jan 2008 21:04

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

holle 11. Jan 2008 21:06

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

DeddyH 11. Jan 2008 21:09

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;

mkinzler 11. Jan 2008 21:16

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;

holle 11. Jan 2008 21:37

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:
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;
Marcel

DeddyH 11. Jan 2008 21:43

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.

mkinzler 11. Jan 2008 21:55

Re: Rückgabewert aus Query auslesen
 
Hav auch das SQL vergessen
Delphi-Quellcode:
ZQuery.Sql.Text := ...
Und .Prepare einfach weglassen

Jelly 11. Jan 2008 22:05

Re: Rückgabewert aus Query auslesen
 
Zitat:

Zitat von holle
Ich benutze folgenden SQL-Befehl, um die Anzahl von Datensätzen zu bestimmen:
Code:
SELECT COUNT(*) FROM (SELECT * FROM tblTracks WHERE path = :path);

Warum so kompliziert...
SQL-Code:
select count(Path) as Anzahl from tblTracks where path = :path
reicht doch allemal.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:56 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz