![]() |
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:
Wenn ich den SQL Befehl ausführe bekomme ich als Recordcount 0 zurück, obwohl der Datensatz definitiv so existiert? Irgendeiner ne Idee wieso?
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; Gruß, Moony |
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 |
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
|
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 |
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. |
Re: SQL ANweisung liefert leere Datenmenge
Zitat:
Gruss wo |
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.
|
Re: SQL ANweisung liefert leere Datenmenge
Hallo,
RecordCount ist keine gute Idee. Du muss nichts drinstehen, Probier mal select count(*) Heiko |
Re: SQL ANweisung liefert leere Datenmenge
Der COUNT Befehl liefert ebenfalls 0 zurück.
|
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 10:26 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