AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Rückgabewert aus Query auslesen

Rückgabewert aus Query auslesen

Ein Thema von holle · begonnen am 11. Jan 2008 · letzter Beitrag vom 12. Jan 2008
Antwort Antwort
Seite 1 von 2  1 2   
holle

Registriert seit: 15. Nov 2005
Ort: Uckerland
138 Beiträge
 
Delphi 7 Enterprise
 
#1

Rückgabewert aus Query auslesen

  Alt 11. Jan 2008, 20:53
Datenbank: SQLite • Version: 3 • Zugriff über: ZeosLib
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
Marcel
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Rückgabewert aus Query auslesen

  Alt 11. Jan 2008, 20:58
Was steht denn in tmp.Strings[i]?

[edit] Wieso eigentlich ZQuery abfragen und das Ergebnis von ZQueryPlay auswerten? [/edit]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
holle

Registriert seit: 15. Nov 2005
Ort: Uckerland
138 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Rückgabewert aus Query auslesen

  Alt 11. Jan 2008, 21:04
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
Marcel
  Mit Zitat antworten Zitat
holle

Registriert seit: 15. Nov 2005
Ort: Uckerland
138 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Rückgabewert aus Query auslesen

  Alt 11. Jan 2008, 21:06
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
Marcel
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Rückgabewert aus Query auslesen

  Alt 11. Jan 2008, 21:09
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;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Rückgabewert aus Query auslesen

  Alt 11. Jan 2008, 21:16
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;
Markus Kinzler
  Mit Zitat antworten Zitat
holle

Registriert seit: 15. Nov 2005
Ort: Uckerland
138 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Rückgabewert aus Query auslesen

  Alt 11. Jan 2008, 21:37
@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
Marcel
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Rückgabewert aus Query auslesen

  Alt 11. Jan 2008, 21:43
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Rückgabewert aus Query auslesen

  Alt 11. Jan 2008, 21:55
Hav auch das SQL vergessen ZQuery.Sql.Text := ... Und .Prepare einfach weglassen
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#10

Re: Rückgabewert aus Query auslesen

  Alt 11. Jan 2008, 22:05
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...
select count(Path) as Anzahl from tblTracks where path = :path reicht doch allemal.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:55 Uhr.
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