Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi ADO: Parameter funktionieren nicht(oder ich wende falsch an) (https://www.delphipraxis.net/62555-ado-parameter-funktionieren-nicht-oder-ich-wende-falsch.html)

Die Muhkuh 6. Feb 2006 12:37

Datenbank: Access • Version: 2000 • Zugriff über: ADO + SQL

ADO: Parameter funktionieren nicht(oder ich wende falsch an)
 
Hi,

ich hab nochmal ein Problem mit meiner Accessdatenbank, auf welche ich per ADO zugreife.

Delphi-Quellcode:
for I := 0 to Count - 1 do
    begin
      p := Items[I];

      profilequery.SQL.Text := 'INSERT INTO profile (user, password, domain, desc) ' +
        'VALUES (:user, :pw, :domain, :desc)';

      with profilequery.Parameters do
      begin
        ParamByName('user').Value := p.Benutzername;

        with TCipher_Rijndael.Create(PW, nil) do
        begin
          ParamByName('pw').Value := EncodeString(p.Passwort);
        end;

        ParamByName('domain').Value := p.Domain;
        ParamByName('desc').Value := p.Beschreibung;
      end;

      tmp := profilequery.SQL.text; // Nur zum Test [1]

      profilequery.ExecSQL;


      profilequery.Close;
    end;
Das Problem ist, dass nach dem einfügen der Parameter, die Parameter nicht verändert werden.
Will heißen, im tmp ([1]) steht noch der SQL-Befehl, ohne die veränderten Parametern.

Vielleicht verwende ich das auch falsch :mrgreen:

Danke für euere Antworten,

mfG,

Manu :hi:

Bernhard Geyer 6. Feb 2006 12:43

Re: ADO: Parameter funktionieren nicht(oder ich wende falsch
 
Zitat:

Zitat von Spider
Das Problem ist, dass nach dem einfügen der Parameter, die Parameter nicht verändert werden.
Will heißen, im tmp ([1]) steht noch der SQL-Befehl, ohne die veränderten Parametern.

Vielleicht verwende ich das auch falsch :mrgreen:

Das was du machst paßt schon. der String in profilequery.SQL.text darf ja auch nicht verändert werden sonst könnte er nicht mehr für weitere Abfragen verwendet werden und damit wäre ein Verwendung von Prepared Statements nicht möglich.

Folgende Codeanpassung dürfte die Inserts um einiges beschleunigen

Delphi-Quellcode:
  profilequery.SQL.Text := 'INSERT INTO profile (user, password, domain, desc) ' +
        'VALUES (:user, :pw, :domain, :desc)';
  profilequery.Prepare;

  for I := 0 to Count - 1 do
  begin
    p := Items[I];

    with profilequery.Parameters do
    begin
      ParamByName('user').Value := p.Benutzername;

      with TCipher_Rijndael.Create(PW, nil) do
      begin
        ParamByName('pw').Value := EncodeString(p.Passwort);
      end;

      ParamByName('domain').Value := p.Domain;
      ParamByName('desc').Value := p.Beschreibung;
    end;

    profilequery.ExecSQL;
  end;

Die Muhkuh 6. Feb 2006 12:48

Re: ADO: Parameter funktionieren nicht(oder ich wende falsch
 
Hi Bernhard,

danke. Hab leider vergessen zu schreiben, dass noch die Fehlermeldung "Syntaxfehler in der INSERT INTO-Anweisung" kommt :oops:
Vielleicht liegt es doch nicht an den Parametern (weil ich das zuerst dachte...).

Bernhard Geyer 6. Feb 2006 12:54

Re: ADO: Parameter funktionieren nicht(oder ich wende falsch
 
Zitat:

Zitat von Spider
Hi Bernhard,

danke. Hab leider vergessen zu schreiben, dass noch die Fehlermeldung "Syntaxfehler in der INSERT INTO-Anweisung" kommt :oops:
Vielleicht liegt es doch nicht an den Parametern (weil ich das zuerst dachte...).

Am SQL-Statement kann ich nichts verdächtiges erkennen.
Aber nimm mal statt Value -> AsString.
Kommt bei EncodeString auch ein "gültiger" String ohne $00 raus?

Die Muhkuh 6. Feb 2006 12:58

Re: ADO: Parameter funktionieren nicht(oder ich wende falsch
 
Hi,

auch ohne EncodeString klappt das nicht. Und ich hab nur Value. AsString kommt "Undefinierter Bezeichner".

Ich verwende ja ein TADOQuery.

Bernhard Geyer 6. Feb 2006 13:00

Re: ADO: Parameter funktionieren nicht(oder ich wende falsch
 
Zitat:

Zitat von Spider
Ich verwende ja ein TADOQuery.

Ersetze mal TADOQuery durch TADODataset.

Die Muhkuh 6. Feb 2006 13:05

Re: ADO: Parameter funktionieren nicht(oder ich wende falsch
 
Hi,

das ADODataset kennt auch kein AsString :-\

Bernhard Geyer 6. Feb 2006 13:12

Re: ADO: Parameter funktionieren nicht(oder ich wende falsch
 
Zitat:

Zitat von Spider
Hi,

das ADODataset kennt auch kein AsString :-\

OK, gibt kein AsString. Hab's mit den Feld-Klassen verwechselt.

Die Muhkuh 6. Feb 2006 13:13

Re: ADO: Parameter funktionieren nicht(oder ich wende falsch
 
Zitat:

Zitat von Bernhard Geyer
Zitat:

Zitat von Spider
Hi,

das ADODataset kennt auch kein AsString :-\

OK, gibt kein AsString. Hab's mit den Feld-Klassen verwechselt.

Dann gehe ich gerade davon, dass du mit deinem Latein am Ende bist?

Bernhard Geyer 6. Feb 2006 13:18

Re: ADO: Parameter funktionieren nicht(oder ich wende falsch
 
Zitat:

Zitat von Spider
Dann gehe ich gerade davon, dass du mit deinem Latein am Ende bist?

Fast

Nenn mal deine Parameter Param1, ... Param4.
Diese Felder sind doch alle vom Typ varchar, oder?

shmia 6. Feb 2006 13:24

Re: ADO: Parameter funktionieren nicht(oder ich wende falsch
 
Zitat:

Zitat von Bernhard Geyer
Am SQL-Statement kann ich nichts verdächtiges erkennen.
Aber nimm mal statt Value -> AsString.

ADOParameter können entweder so
Delphi-Quellcode:
ADOdataset.Parameters.ParamValues['user'] := username;  // Variante A
// oder so
ADOdataset.Parameters.ParamByName('user').Value := username; // Variante B
befüllt werden.
Ich verwende meist Variante A, da weniger Schreibarbeit.
.AsString, .AsInteger, u.s.w. gibt es bei den Parametern nicht.

Zum Debuggen sollte man besser kein With ... Do Anweisung verwenden, sondern alles komplett ausschreiben.
Zumindest Delphi 2-5 können sonst die Inhalte beim Debuggen nicht anzeigen.

Wichtig: wenn die INSERT-Anweisung korrekt aussieht, aber dennoch Syntaxfehler gemeldet wird, liegt es meist an der Verwendung von reservierten Wörtern. Die Wörter "user" und "domain" könnten je nach SQL-Dialekt schon eine eigene Bedeutung haben.
Ich würde empfehlen, die Feldnamen zu ändern.

PS:
Delphi-Quellcode:
 // das gefällt mir überhaupt nicht
 // es sieht nach einem Speicherleck aus
 with TCipher_Rijndael.Create(PW, nil) do
 begin
   ParamByName('pw').Value := EncodeString(p.Passwort);
 end;
 // ich würde das Passwort zunächst direkt im Klartext speichern
 // nachdem das funktioniert hat, würde ich das verschlüsselte PW speichern

Die Muhkuh 6. Feb 2006 13:36

Re: ADO: Parameter funktionieren nicht(oder ich wende falsch
 
Hi,

bin jetzt wieder zurück zum TADOQuery.

@shmia

Danke :)
Das mit den Feldbezeichnungen wars. Hab die geändert und zack, gings.

Das mit deinem PS hab ich schon geändert, trotzdem danke ;-)

shmia 6. Feb 2006 13:43

Re: ADO: Parameter funktionieren nicht(oder ich wende falsch
 
Zitat:

Zitat von Spider
Das mit den Feldbezeichnungen wars. Hab die geändert und zack, gings.

Fein. Dann hoffe ich mal, dass sich diese reservierte Wörter in dein (und das der Mitleser) Gedächtnis eingebrannt hat.
Hier noch ein paar Listen dazu:
http://msdn.microsoft.com/library/de...ra-rz_9oj7.asp
http://developer.mimer.com/validator...rved-words.tml
http://www.jsoftware.com/books/help/...rved_words.htm
Man kann sich wirklich dumm und dämlich suchen, falls man eines dieser Wörter als Tabellen-, View- oder Feldname benützt.

Die Muhkuh 6. Feb 2006 13:48

Re: ADO: Parameter funktionieren nicht(oder ich wende falsch
 
Zitat:

Zitat von shmia
Zitat:

Zitat von Spider
Das mit den Feldbezeichnungen wars. Hab die geändert und zack, gings.

Fein. Dann hoffe ich mal, dass sich diese reservierte Wörter in dein (und das der Mitleser) Gedächtnis eingebrannt hat.
Hier noch ein paar Listen dazu:
http://msdn.microsoft.com/library/de...ra-rz_9oj7.asp
http://developer.mimer.com/validator...rved-words.tml
http://www.jsoftware.com/books/help/...rved_words.htm
Man kann sich wirklich dumm und dämlich suchen, falls man eines dieser Wörter als Tabellen-, View- oder Feldname benützt.

Hihi, dass hoffe ich auch :mrgreen:

Danke für die Links ;-) Sowas kann man immer brauchen :D

heyko 11. Apr 2007 11:32

Re: ADO: Parameter funktionieren nicht(oder ich wende falsch
 
Ich grabe diesen Thread mal wieder aus da mein Problem sehr ähnlich ist.


SQL:
Zitat:

SELECT * FROM tw_nutzer WHERE( userid = :param1 AND password = :param2 )
Code:
Delphi-Quellcode:
      {Zugriffsberechtigung des Nutzers aus TW_Nutzer abfragen}
      with qrySelNutzer do
      begin
        prepared:= true;
        active := false;
        close;
        Parameters.ParamByName('param1').Value  :=  edit_benutzer.text;
        Parameters.ParamByName('param2').Value :=  edit_password.text;
        prepared := true;
        ExecSQL;
      end;
Letzten Endes wird aber nur folgendes ausgeführt:
Zitat:

SELECT * FROM tw_nutzer WHERE ( userid = ? AND password = ? )
Hilfe :pale:

shmia 11. Apr 2007 11:40

Re: ADO: Parameter funktionieren nicht(oder ich wende falsch
 
Delphi-Quellcode:
with qrySelNutzer do
begin
   close;
   // Schreibweise mit ParamValues[] ist kürzer als ParamByName().Value
   Parameters.ParamValues['param1'] := edit_benutzer.text;
   Parameters.ParamValues['param2'] := edit_password.text;
//   ExecSQL; // FALSCH! SELECT * FROM .... gibt ja eine Datenmenge zurück
   Open; // Richtig
end;

mkinzler 11. Apr 2007 11:53

Re: ADO: Parameter funktionieren nicht(oder ich wende falsch
 
Im ursprünlichen Thread ging es aber um einen INSERT

heyko 11. Apr 2007 12:13

Re: ADO: Parameter funktionieren nicht(oder ich wende falsch
 
Zitat:

Zitat von mkinzler
Im ursprünlichen Thread ging es aber um einen INSERT

ja tut mir Leid ähnlich nicht identisch. :)

Leider hat mir das nicht geholfen. Habe es jetzt zwar abgekürzt aber laut ADOConnectionExecuteComplete sind die Platzhalter Fragezeichen immer noch da und wurden nicht durch die Werte ersetzt.

Habe es auf

Delphi-Quellcode:
      with qrySelNutzer do
      begin
        close;
        Parameters.ParamValues['param1'] :=  edit_benutzer.text;
        Parameters.ParamValues['param2'] :=  edit_password.text;
        Open;
...
geändert.

SQL Command:
SQL-Code:
SELECT *  FROM tw_nutzer WHERE ( userid = ? AND password = ? )

shmia 11. Apr 2007 13:24

Re: ADO: Parameter funktionieren nicht(oder ich wende falsch
 
Zitat:

Zitat von heyko
.. aber laut ADOConnectionExecuteComplete sind die Platzhalter Fragezeichen immer noch da und wurden nicht durch die Werte ersetzt.

Achso! Diesen SQL-Text mit ersetzten Parametern wirst du auch nicht so einfach bekommen.
Die Ersetzung der Parameter Fragezeichen findet erst tiefer in einer ADO Treiberschicht statt.

Trotzdem arbeitet die Abfrage mit Parametern richtig.
Möglicherweise kann man die Parameterersetzung anhand des Interface "Command15" selbst vornehmen,
aber das passt jetzt nicht mehr zu diesen Thread.

heyko 11. Apr 2007 13:27

Re: ADO: Parameter funktionieren nicht(oder ich wende falsch
 
Okay vielen Dank erstmal.


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