Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi [MySQL] überprüfen ob ein Datensatz existiert (https://www.delphipraxis.net/51173-%5Bmysql%5D-ueberpruefen-ob-ein-datensatz-existiert.html)

BastardOp 7. Aug 2005 19:15

Datenbank: MySQL • Zugriff über: libmysql.dll

[MySQL] überprüfen ob ein Datensatz existiert
 
Hi

ich hab ein Programm in dem ich auf eine MySQL Datenbank zugreife. Nun möchte ich überprüfen ob eine datensatz mit gewissen Bedingungen schon existiert. Die Abfrage sieht so aus:
SQL-Code:
SELECT * FROM user WHERE email='email'
alledings gibt das bei mir immer eine zugriffs verletzung in der libmysql.dll wenn ein entsprechender eintrag NICHt existiert.

Wie kann ich nun überprüfen ob ein datensatz mit den gewünschten bedingungen existiert oder nicht?


MfG
BastardOp

Joachim Rohde 7. Aug 2005 19:18

Re: [MySQL] überprüfen ob ein Datensatz existiert
 
Zeig mal etwas Code... an deinem SQL-Statement dürfte es nämlich nicht liegen. Oder greifst du vielleicht auf die Resultmenge zu, die ja gar nicht existiert?

BastardOp 7. Aug 2005 19:26

Re: [MySQL] überprüfen ob ein Datensatz existiert
 
so sieht der code zum abfragen bei mir aus

Delphi-Quellcode:
query:= 'SELECT * FROM user WHERE email="'+email+'"';
mysql_real_query(_mycon, query, Length(query));

_myRes := mysql_store_result(_mycon);

SetLength(Posts, mysql_num_rows(_myRes));
for i:= 0 to High(Posts) do
begin
_myRow := mysql_fetch_row(_myRes);

marabu 7. Aug 2005 20:08

Re: [MySQL] überprüfen ob ein Datensatz existiert
 
Wenn die Ergebnismenge leer ist, dann liefert dir mysql_num_rows 0 zurück. Verwendest du 0 zur Dimensionierung eines dynamischen Arrays, dann wird die Array-Variable Posts = nil. Du musst deinen Code ein wenig ändern:

Delphi-Quellcode:
query := 'SELECT * FROM user WHERE email="'+email+'"';
mysql_real_query(_mycon, query, Length(query));

_myRes := mysql_store_result(_mycon);

SetLength(Posts, mysql_num_rows(_myRes));
if Assigned(Posts) then // diese Zeile ist wichtig!
  for i:= 0 to High(Posts) do begin
    _myRow := mysql_fetch_row(_myRes);
    ...
  end;
Grüße vom marabu

BastardOp 7. Aug 2005 20:16

Re: [MySQL] überprüfen ob ein Datensatz existiert
 
thx für die antwort werd ich morgen mal in aller ruhe ausprobiern.

teebee 7. Aug 2005 22:14

Re: [MySQL] überprüfen ob ein Datensatz existiert
 
Das Problem liegt nicht darin, dass das Array Posts die Länge 0 hat, dann würde High nämlich einfach -1 zurückliefern und alles wäre ok. Die AV kommt ja außerdem aus der libmysql.dll und nicht aus der Anwendung.
Hier verhält es sich so, dass _myRes Nil ist, wenn die Ergebnismenge leer ist. Der darauffolgende Aufruf von mysql_num_rows() mit Nil als Argument führt zu der AV.
Abhilfe:
Delphi-Quellcode:
query := 'SELECT * FROM user WHERE email="'+email+'"';
mysql_real_query(_mycon, query, Length(query));

_myRes := mysql_store_result(_mycon);

If Assigned(_myRes) Then Begin // nur weitermachen, wenn was da ist
  SetLength(Posts, mysql_num_rows(_myRes));
  for i:= 0 to High(Posts) do begin
    _myRow := mysql_fetch_row(_myRes);
    ...
  end;
End;
Gruß, teebee

marabu 8. Aug 2005 06:49

Re: [MySQL] überprüfen ob ein Datensatz existiert
 
Hallo teebee,

Zitat:

Zitat von teebee
Das Problem liegt nicht darin, dass das Array Posts die Länge 0 hat, dann würde High nämlich einfach -1 zurückliefern und alles wäre ok.

In meinen Programmen resultiert dynArray = nil aus SetLength(dynArray, 0).

Zitat:

Zitat von teebee
Die AV kommt ja außerdem aus der libmysql.dll und nicht aus der Anwendung.

Das behauptet der thread owner, der gezeigte code gibt das aber nicht her.

Zitat:

Zitat von teebee
Hier verhält es sich so, dass _myRes Nil ist, wenn die Ergebnismenge leer ist.

Diese Implikation ist definitiv falsch. Die Kontrollstruktur für den result set wird auch für die leere Menge erzeugt.

Zitat:

Zitat von teebee
Der darauffolgende Aufruf von mysql_num_rows() mit Nil als Argument führt zu der AV.

Tatsächlich produziert der Aufruf von mysql_num_rows(nil) eine AV, wenn aber _myres nil ist, dann nicht wegen eines leeren result set, sondern eher wegen einer fehlerhaften query.

Grüße vom marabu

teebee 8. Aug 2005 07:24

Re: [MySQL] überprüfen ob ein Datensatz existiert
 
Hallo marabu,
Zitat:

Zitat von marabu
Zitat:

Zitat von teebee
Das Problem liegt nicht darin, dass das Array Posts die Länge 0 hat, dann würde High nämlich einfach -1 zurückliefern und alles wäre ok.

In meinen Programmen resultiert dynArray = nil aus SetLength(dynArray, 0).

In meinen auch. Aber High funktioniert trotzdem und liefert dann -1
Zitat:

Zitat von marabu
Zitat:

Zitat von teebee
Die AV kommt ja außerdem aus der libmysql.dll und nicht aus der Anwendung.

Das behauptet der thread owner, der gezeigte code gibt das aber nicht her.

Doch. wenn _myres Nil ist, kommt es beim Aufruf von mysql_num_rows() genau dazu. (s.u)
Zitat:

Zitat von marabu
Zitat:

Zitat von teebee
Hier verhält es sich so, dass _myRes Nil ist, wenn die Ergebnismenge leer ist.

Diese Implikation ist definitiv falsch. Die Kontrollstruktur für den result set wird auch für die leere Menge erzeugt.

Für eine SELECT-query (die wir hier ja zweifellos haben) hast Du allerdings recht.
Zitat:

Zitat von marabu
Zitat:

Zitat von teebee
Der darauffolgende Aufruf von mysql_num_rows() mit Nil als Argument führt zu der AV.

Tatsächlich produziert der Aufruf von mysql_num_rows(nil) eine AV, wenn aber _myres nil ist, dann nicht wegen eines leeren result set, sondern eher wegen einer fehlerhaften query.

Stimmt natürlich, s.o.
_myRes sollte trotzdem auf Nil geprüft werden, wenn auch nicht, um eine leere Ergebnismenge abzufragen.

Gruß, teebee


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:54 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