Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Standardwert bei ADO-Abfrage (https://www.delphipraxis.net/132508-standardwert-bei-ado-abfrage.html)

dominikkv 14. Apr 2009 13:05

Datenbank: Access • Zugriff über: ADO

Standardwert bei ADO-Abfrage
 
Hi,

ich versuche grade über ADO auf eine Access-Datenbank zuzugreifen.

Delphi-Quellcode:
procedure TDatenbank.DiscountExists(EAN: string);
begin
  if fConnection.Connected then
    with fQuery do
      begin
        Close;
        SQL.Clear;
       // Active := False;

       // fConnection.BeginTrans;

        SQL.Add('SELECT * FROM `Products`, `Discounts` WHERE (`Discounts`.ProduktFKID = `Products`.PKID) AND (EAN = ''0123456789'')');
        try
          Open;
         // fConnection.CommitTrans;
        except
         // fConnection.RollbackTrans;
        end;
      end;
end;
Jetzt kommt nach dem Open; aber immer die Fehlermeldung
Zitat:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt MeinProgramm.exe ist eine Exception der Klasse EOleException mit der Meldung 'Parameter`Discounts`.ProduktFKID hat keinen Standardwert' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------
Was mache ich falsch?

mfg.Dominik

DeddyH 14. Apr 2009 13:10

Re: Standardwert bei ADO-Abfrage
 
Muss man bei Access nicht eckige Klammern statt der Backticks verwenden? Diese kenn ich nämlich eigentlich eher von MySQL.

onkelmehli 14. Apr 2009 13:11

Re: Standardwert bei ADO-Abfrage
 
schon mal so versucht?
SQL-Code:
SQL.Add('SELECT * FROM Products, Discounts WHERE (Discounts.ProduktFKID = Products.PKID) AND (EAN = ''0123456789'')');

DeddyH 14. Apr 2009 13:21

Re: Standardwert bei ADO-Abfrage
 
Oder so?
Delphi-Quellcode:
procedure TDatenbank.DiscountExists(EAN: string);
begin
  if fConnection.Connected then
    with fQuery do
      begin
        Close;
        SQL.Clear;
        SQL.Add('SELECT [Products].*,[Discounts].* FROM [Products] ');
        SQL.Add('INNER JOIN [Discounts] ON [Discounts].ProduktFKID = [Products].PKID');
        SQL.Add('WHERE EAN = :EAN');
        Parameters.ParamByName('EAN').Value := EAN;
        try
          Open;
         // fConnection.CommitTrans;
        except
         // fConnection.RollbackTrans;
        end;
      end;
end;

dominikkv 14. Apr 2009 15:09

Re: Standardwert bei ADO-Abfrage
 
Danke schon mal für eure Antworten.
Zitat:

Zitat von onkelmehli
schon mal so versucht?
SQL-Code:
SQL.Add('SELECT * FROM Products, Discounts WHERE (Discounts.ProduktFKID = Products.PKID) AND (EAN = ''0123456789'')');

Ja, gleiche Fehlermeldung wie oben.


Zitat:

Zitat von DeddyH
Oder so?
Delphi-Quellcode:
procedure TDatenbank.DiscountExists(EAN: string);
begin
  if fConnection.Connected then
    with fQuery do
      begin
        Close;
        SQL.Clear;
        SQL.Add('SELECT [Products].*,[Discounts].* FROM [Products] ');
        SQL.Add('INNER JOIN [Discounts] ON [Discounts].ProduktFKID = [Products].PKID');
        SQL.Add('WHERE EAN = :EAN');
        Parameters.ParamByName('EAN').Value := EAN;
        try
          Open;
         // fConnection.CommitTrans;
        except
         // fConnection.RollbackTrans;
        end;
      end;
end;

Neue Fehlermeldung:
Zitat:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt MeinProgramm.exe ist eine Exception der Klasse EOleException mit der Meldung 'Für mindestens einen erforderlichen Parameter wurde kein Wert angegeben' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------
In EAN: string steht aber etwas drinn.
Wenn ich
Delphi-Quellcode:
SQL.Add('WHERE EAN = 0123456789');// oder
SQL.Add('WHERE EAN = ''0123456789''');
schreibe kommt wieder die Fehlermeldung mit dem Standardwert von oben.

DeddyH 14. Apr 2009 15:17

Re: Standardwert bei ADO-Abfrage
 
Lass Dir die Abfrage doch von Access selbst generieren, dann müsstest Du nur den Parameter einsetzen. Ich kenne leider die genaue Syntax nicht.

onkelmehli 14. Apr 2009 15:39

Re: Standardwert bei ADO-Abfrage
 
fehlt dann da nicht noch [], also so?
SQL-Code:
SQL.Add('WHERE [EAN] = :EAN');

dominikkv 14. Apr 2009 15:45

Re: Standardwert bei ADO-Abfrage
 
Zitat:

Zitat von DeddyH
Lass Dir die Abfrage doch von Access selbst generieren, dann müsstest Du nur den Parameter einsetzen. Ich kenne leider die genaue Syntax nicht.

Daran habe ich noch garnicht gedacht :oops:

Die korrekte Syntax lautet
Delphi-Quellcode:
SQL.Add('SELECT Discounts.ProductFKID');
SQL.Add('FROM Products, Discounts');
SQL.Add('WHERE (([Discounts]![ProductFKID]=[Products]![PKID]) AND ([Products]![EAN]="' + EAN + '"));');
Danke für eure Hilfe :cheers:

DeddyH 14. Apr 2009 15:49

Re: Standardwert bei ADO-Abfrage
 
Trotzdem solltest Du die Abfrage besser parametrisieren wie oben gezeigt, sonst kann es zu dummen Fehlern oder gar zu SQL-Injection kommen.

p80286 14. Apr 2009 16:20

Re: Standardwert bei ADO-Abfrage
 
bei dieser Syntax überkommt einen das Grausen:
SQL-Code:
WHERE (([Discounts]![ProductFKID]=[Products]![PKID]) AND ([Products]![EAN]="' + EAN + '"));
Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 10: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 by Thomas Breitkreuz