Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL ANweisung liefert leere Datenmenge (https://www.delphipraxis.net/130098-sql-anweisung-liefert-leere-datenmenge.html)

Moony 3. Mär 2009 12:49

Datenbank: MSAccess, MSSQL, MySQL, DB2, Oracle • Zugriff über: TADOConnection

SQL ANweisung liefert leere Datenmenge
 
Hallo zusammen,

ich versuche über ein Modul nach dem vorhandesein des zu bearbeitenden Datensatzes nachzufragen. Denn während ich meine Datensätze markiere und nicht aktualisiere, kann es sein dass vom einem Host an den Datensätzen was geändert wurde und somit mir zur Bearbeitung nicht mehr zur Verfügung stehen.

Deshalb übergebe ich an mein Modul zwei Listen: Names & Values.
Names beinhaltet die Feldnamen kommasepariert und Values die dazugehörigen Inhalte des aktuellen Datensatzes.

Die Funktion sieht dann folgendermaßen aus:

Delphi-Quellcode:
function FindMyRecord(var Names,Values: PChar): Boolean;
var SQL     : String;
    myTable,
    myConn  : String;
    Ini     : TIniFile;
    myDB    : TADOConnection;
    myDS    : TADODataSet;
    FN, FV  : TStringList;
begin
   Result := false;

  Ini := TIniFile.Create(Project.Name);
  try
    myTable := Ini.ReadString('DatabaseSettings', 'DatabaseTable', '');
    myConn := Ini.ReadString('DatabaseSettings', 'DatabaseFileName', '');
  finally
    Ini.Free;
  end;

  if (myConn = '') or (myTable = '') then
     Exit;

  myDB := TADOConnection.Create(nil);
  myDS := TADODataSet.Create(nil);
  FN  := TStringList.Create;
  FV  := TStringList.Create;
  try
    myDB.ConnectionString := myConn;
    myDB.Open;

    if myDB.Connected then
    begin
      FN.CommaText := String(Names);
      FV.CommaText := String(Values);

      myDS.Connection := myDB;

      SQL := 'SELECT * FROM ' + myTable + ' WHERE ';

      for i := 0 to FN.Count - 1 do
      begin
         SQL := SQL + FN.Strings[i] + '=''' + FV.Strings[i] + '''';

        if i < FN.Count - 1 then
           SQL := SQL + ' AND ';
      end;

      myDS.CommandText := SQL;
      myDS.Open;

      if myDS.RecordCount > 0 then
         Result := true;
    end;
  finally
    FN.Free;
    FV.Free;
    myDB.Free;
    myDS.Free;
  end;
end;
Wenn ich den SQL Befehl ausführe bekomme ich als Recordcount 0 zurück, obwohl der Datensatz definitiv so existiert? Irgendeiner ne Idee wieso?

Gruß, Moony

zack0r 3. Mär 2009 13:07

Re: SQL ANweisung liefert leere Datenmenge
 
Hm ich würd mir einfach am Ende mal die SQL-Anfrage ausgeben lassen, wenn die Schleife die zusammengebaut hat, da stimmt bestimmt irgendwas nich.
Bleibt nicht am ende ein 'AND ' stehen? Und fehlt nicht das Semikolon am Ende der Anfrage? Ich weiß nicht wie genau das dein DBMS nimmt.

zack0r

Jürgen Thomas 3. Mär 2009 13:19

Re: SQL ANweisung liefert leere Datenmenge
 
... und solche String-Verknüpfung für SQL-Befehle gehört sowieso verboten; dafür gibt es die Parameter, die auch in Deiner Situation sinnvoll sind. Jürgen

WoGe 3. Mär 2009 14:54

Re: SQL ANweisung liefert leere Datenmenge
 
..und ich würde meine Tabellen um ein LastModifiedTimestamp erweitern und das durch einen Trigger befüllen.
Dann wüsste man sowas allein aufgrund der Uhrzeit...

Grüsse
wo

Moony 3. Mär 2009 16:01

Re: SQL ANweisung liefert leere Datenmenge
 
@Woge:
Da ich nicht weiß ob es in den Tabellen ein solches Feld gibt, bin ich auf das angewiesen was ich bekomme. Also fällt das schon mal weg. Da ich den Kunden nicht vorgeben kann welche Felder sie sich bauen.

@Jürgen:
Warum ist der SQL Befehl nicht richtig? Es ist richtig zusammengesetzt und führt zu keinerlei Fehlern!

@zack:
Ich habe mir die SQL Anweisung angeschaut bevor sie ausgeführt wird. Wenn ein AND zuviel da stünde, würde der Befehl an sich nciht ausgeführt werden und in eine Exception laufen. Was aber nicht der Fall ist. Die Datenmenge liefert mir einen Recordcount von 0 zurück.

WoGe 3. Mär 2009 16:16

Re: SQL ANweisung liefert leere Datenmenge
 
Zitat:

Zitat von Moony
Es ist richtig zusammengesetzt und führt zu keinerlei Fehlern!

Wenn die Frage richtig ist, könnte dann 0 nicht auch die richtige Antwort sein?

Gruss
wo

Moony 3. Mär 2009 16:34

Re: SQL ANweisung liefert leere Datenmenge
 
Der Datensatz existiert genauso in der Form wie ich ihn angefragt habe. Ich habe in der Zwischenzeit keinerleio Änderungen vorgenommen.

hoika 3. Mär 2009 17:07

Re: SQL ANweisung liefert leere Datenmenge
 
Hallo,

RecordCount ist keine gute Idee.
Du muss nichts drinstehen,

Probier mal select count(*)


Heiko

Moony 4. Mär 2009 08:01

Re: SQL ANweisung liefert leere Datenmenge
 
Der COUNT Befehl liefert ebenfalls 0 zurück.

ULIK 4. Mär 2009 08:18

Re: SQL ANweisung liefert leere Datenmenge
 
Dann ist auch kein Datensatz da, der der entsprechenden Where-Bedingung entspricht. Laß Dir doch mal das komplette generierte SQL-Statement ausgegeben und führ es dann per Hand aus. Vieleicht siehst Du dann, warum keine Daten geliefert werden.
Abgesehen davon: kann es sein, daß der Host den Record erzeugt hat, Du ihn aber noch nicht sehen kannst, weil er die Daten noch nicht commited hat? Oder umgekehrt, daß die Daten nicht gefunden werden, WEIL der Host inzwischen geändert und commited hat?

Grüße,
Uli


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:04 Uhr.
Seite 1 von 4  1 23     Letzte »    

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