Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Datenbankfehler in Delphi (https://www.delphipraxis.net/207402-datenbankfehler-delphi.html)

S4nikrA 20. Mär 2021 16:22

Datenbank: Access • Version: egal • Zugriff über: Delphi

Datenbankfehler in Delphi
 
Schönen Guten Tag liebe Community!:-D
Ich hätte eine Frage zu einer Datenbankanbindung, warum Delphi da rum meckert, obwohl die Daten dann schon in der Datenbank niedergeschrieben sind.
Es kommt immer wieder zu folgendem Fehler:"Commandtext gibt keine Ereignismenge zurück"

Was bedeudet das? Ist da jemand Fachmann/frau in dem Thema?:thumb:

haentschman 20. Mär 2021 16:28

AW: Datenbankfehler in Delphi
 
Moin...:P
Zitat:

"Commandtext gibt keine Ereignismenge zurück"
...kann es sein daß du ExecSQL statt Open benutzt? :gruebel: Der Quelltext wäre hilfreich. :wink:

S4nikrA 20. Mär 2021 16:30

AW: Datenbankfehler in Delphi
 
Delphi-Quellcode:
procedure TForm1.BteinlesenClick(Sender: TObject);
var vname, nname: string;
begin
  if (Edvname.text <> ('')) and (Edname.Text <> ('')) then
    begin
      showmessage('Funkioniert');
    end
      else
        begin
          showmessage('Werte eingeben!');
        end;

  vname := Edvname.Text;
  nname := Edname.Text;

  abfrage := 'select vorname, nachname From Spieler Where vorname ="'+vname+'" and nachname="'+nname+'"';

  Datenmodul.ADOQuery3.SQL.Clear;
  Datenmodul.ADOQuery3.SQL.Add(abfrage);
  Datenmodul.ADOQuery3.Open;

  if Datenmodul.ADOQuery3.IsEmpty then
    begin
      showmessage('nicht vorhanden!');

      Panel1.Visible := false;
      PAbfrage.Visible := true;

      eintrag := 'insert into spieler(vorname, nachname, Bestwert, Bestwert1, Bestwert2) values ("'+Edvname.text+'","'+Edname.Text+'","0","0","0")';
    end
      else
        begin
          showmessage('vorhanden!');

        end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Panel1.Visible := true;
  PAbfrage.Visible := false;
end;

procedure TForm1.PjClick(Sender: TObject);
begin
  Datenmodul.ADOQuery4.SQL.Clear;
  Datenmodul.ADOQuery4.SQL.Add(eintrag);
  Datenmodul.ADOQuery4.Active := true;
  Panel1.Visible := false;
  PAbfrage.Visible := false;
  showmessage('erfolgreich eingetragen!');
end;

procedure TForm1.PnClick(Sender: TObject);
begin
  Panel1.Visible := true;
  PAbfrage.Visible := false;
end;
Die genaue Problemstelle liegt bei ADOQuery4, der Rest läuft und flutscht, wie es sollte.

DieDolly 20. Mär 2021 16:41

AW: Datenbankfehler in Delphi
 
Delphi-Quellcode:
  if (Edvname.text <> ('')) and (Edname.Text <> ('')) then
    begin
      showmessage('Funkioniert');
    end
      else
        begin
          showmessage('Werte eingeben!');
        end;
Wenn ich sowas schon sehe, wird mir irgendwie schlecht.

Drück mal STRG+D im Editor! Und guck dir bitte einen Delphi-Style-Guide an.
Viele Probleme lösen sich von selbst und sind sofort sichtbar, wenn man den Code vernünftig hinschreibt.

Redeemer 20. Mär 2021 16:44

AW: Datenbankfehler in Delphi
 
Zitat:

Zitat von S4nikrA (Beitrag 1485633)
Delphi-Quellcode:
      eintrag := 'insert into spieler(vorname, nachname, Bestwert, Bestwert1, Bestwert2) values ("'+Edvname.text+'","'+Edname.Text+'","0","0","0")';

Escape, fools!

S4nikrA 20. Mär 2021 16:45

AW: Datenbankfehler in Delphi
 
Danke für den Tipp, aber so haben wir es gelernt bekommen und in ein paar Wochen arbeite ich damit nicht mehr.
Es ist nur für das letzte Projekt wichtig.:!:

DieDolly 20. Mär 2021 16:46

AW: Datenbankfehler in Delphi
 
Zitat:

Danke für den Tipp, aber so haben wir es gelernt bekommen und in ein paar Wochen arbeite ich damit nicht mehr.
Lehrer dir das so lehren gehören sofort gekündigt.

S4nikrA 20. Mär 2021 16:48

AW: Datenbankfehler in Delphi
 
Hab es gemacht, nur habe ich immer noch keine Lösung auf das Problem.

Delphi.Narium 20. Mär 2021 16:49

AW: Datenbankfehler in Delphi
 
Die Fehlermeldung besagt, das die Abfrage kein Ergebnis liefert, was bei Insert, Update, Delete ... völlig normal ist.
Man darf active := true bzw. open nur bei Select-Statements nutzen, sonst muss man immer ExecSQL verwenden.
Delphi-Quellcode:
procedure TForm1.PjClick(Sender: TObject);
begin
  Datenmodul.ADOQuery4.SQL.Clear;
  Datenmodul.ADOQuery4.SQL.Add(eintrag);
  Datenmodul.ADOQuery4.ExecSQL; // .Active = true bzw. .Open darf man nur bei Select nutzen, sonst IMMER ExecSQL.
  Panel1.Visible := false;
  PAbfrage.Visible := false;
  if Datenmodul.ADOQuery4.RowsAffected > 0 then begin
    showmessage('erfolgreich eingetragen!');
  end else begin
    showmessage('Sinnvolle Fehlermeldung ausgeben!');
  end;
end;

haentschman 20. Mär 2021 16:51

AW: Datenbankfehler in Delphi
 
Delphi-Quellcode:
Datenmodul.ADOQuery4.Active := true;
->
Delphi-Quellcode:
Datenmodul.ADOQuery4.ExecSQL;

S4nikrA 20. Mär 2021 16:52

AW: Datenbankfehler in Delphi
 
Du bist mein Held heute!
Vielen lieben Dank, ohne die Hilfe hätten wir bis morgen noch gesessen.

himitsu 20. Mär 2021 20:28

AW: Datenbankfehler in Delphi
 
Active:=True und Open ist das Gleiche.
Dein INSERT-Statement ist aber nichts, was ein Result liefert, also wird gemeckert.
Lösung: Execute statt Open

Und dennoch,
* niemals Statements per Text zusammenbauen
* vor allem nicht "richtiges" ohne Escaping der Strings
Lösung: Parameter verwenden

generic 20. Mär 2021 22:16

AW: Datenbankfehler in Delphi
 
@S4nikrA

Wichtiges Thema!

Wenn du SQL Statements mit einen String zusammen baust, dann hast du ein Sicherheitsproblem!
Das Thema heißt "SQL-Injections" - google das mal bitte!

Umgehen kannst du dieses Problem, indem du die Daten als Parameter an die Datenbankfunktionen übergibts.

TurboMagic 21. Mär 2021 10:32

AW: Datenbankfehler in Delphi
 
Rchtig: Parameter benutzen für Inserts und Updates.
Dazu im SQL-Statement die Parameter so reinschreiben:

Insert into TableName (Column1, Column2)
values (:Parameter1Name, :Parameter2Name)

und im Code z.B. mittels ParamByName('Parameter1Name).AsString = 'Hallo';
setzen. Das ist jetzt natrlich nicht ganz vollständig, soll dir aber ein wenig die Richtung aufzeigen.


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