AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi ADOQuery mit Parametern - Ich kriegs nicht hin!
Thema durchsuchen
Ansicht
Themen-Optionen

ADOQuery mit Parametern - Ich kriegs nicht hin!

Ein Thema von guidobrose · begonnen am 20. Mär 2007 · letzter Beitrag vom 21. Mär 2007
Antwort Antwort
guidobrose
(Gast)

n/a Beiträge
 
#1

ADOQuery mit Parametern - Ich kriegs nicht hin!

  Alt 20. Mär 2007, 16:22
Datenbank: MSSQL • Zugriff über: ADO
Hallo,

ich habe zwar schon einige Beiträge zu dem Thema gefunden, aber ich krieg es trotzdem nicht hin.

Delphi-Quellcode:
ADOQry.Close;
ADOQry.SQL.Clear;
ADOQry.Parameters.CreateParameter('Benutzer',ftString,pdUnknown,255,'');
ADOQry.Parameters.ParamValues['Benutzer']:='''Test2''';
ADOQry.SQL.Add('IF NOT EXISTS(SELECT * FROM ADMN WHERE ADKNN>''USRRG'' AND ADDAT=:Benutzer)');
ADOQry.SQL.Add('INSERT ADMN VALUES(''USRRG1'',:Benutzer)');
ADOQry.ExecSQL;
Ich habe da schon einiges ausprobiert, aber es wird immer eine exception ausgelöst
"Parameter object is improperly defined. Inconsistent or incomplete information was provided"

Bevor Fragen nach dem NOT EXISTS kommen; es fehlt hier natürlich noch ELSE UPDATE...

Danke von Guido
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: ADOQuery mit Parametern - Ich kriegs nicht hin!

  Alt 20. Mär 2007, 16:32
Du machst das viel zu umständlich!
Man kann nur SELECT, INSERT oder UPDATE zusammen mit Parametern verwenden.
Deine Konstruktion mit IF ist so höchstens als Stored Procedure zulässig.
Delphi-Quellcode:
query1.SQL.Text := 'SELECT * FROM ADMN WHERE (ADKNN>:UserKenn) AND (ADDAT=:Benutzer)';
query1.Parameter.paramValues['UserKenn'] := 'USRRG';
query1.Parameter.paramValues['Benutzer'] := 'Test2';
query1.open;
if query1.Isempty then
begin
   query1.Append;
   query1['ADKNN'] := 'USRRG';
   query1['ADDAT'] := 'Test2';
   query1.Post;
end;
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von rwachtel
rwachtel

Registriert seit: 26. Aug 2004
Ort: Köln
530 Beiträge
 
RAD-Studio 2010 Pro
 
#3

Re: ADOQuery mit Parametern - Ich kriegs nicht hin!

  Alt 20. Mär 2007, 16:52
Zitat von shmia:
[...] Deine Konstruktion mit IF ist so höchstens als Stored Procedure zulässig. [...]
Bist Du Dir sicher? Ich meine mich zu erinnern, dass genau das der hier verwendete MS SQL Server kann.
Robert Wachtel
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.351 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: ADOQuery mit Parametern - Ich kriegs nicht hin!

  Alt 20. Mär 2007, 17:00
Hi,

IMHO muss man die Parameter nicht erzeugen. Ein Prepare erzeugt diese automatisch.

EDIT

Delphi-Quellcode:
ADOQry.Close;
ADOQry.SQL.Clear;
ADOQry.SQL.Add(...;
ADOQry.Prepared := True; // erstellt Parameter
ADOQry.Parameters.ParamValues['Benutzer']:='Test2';
ADOQry.ExecSQL;
/EDIT

Cu, Frank
Frank Reim
  Mit Zitat antworten Zitat
Benutzerbild von Kedariodakon
Kedariodakon

Registriert seit: 10. Sep 2004
Ort: Mönchengladbach
833 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: ADOQuery mit Parametern - Ich kriegs nicht hin!

  Alt 20. Mär 2007, 17:44
Zitat von shmia:
[...] Deine Konstruktion mit IF ist so höchstens als Stored Procedure zulässig. [...]


Ich denk nicht...
Schleifen, If-Abfragen, Case-Anweisungen, aufruf von Proceduren, verwendung von Variablen..... Kann man auch so verwenden und nicht nur in Stored Procedure...

Das ist ein Punkt, warum ich lieber einen MSSQL nehm als so ein MySQL Dinge... Man ist einfach flexiler...

Zitat von dataspider:
IMHO muss man die Parameter nicht erzeugen. Ein Prepare erzeugt diese automatisch.
Korrekt


Ich denke ich hab den Fehler...
ADOQry.Parameters.ParamValues['Benutzer']:='Test2'; Du verwendest mehr als einmal den Parameter!
Wahrscheinlich wird er mehrmals hinzugefügt und nur einer mit einem Wert bespielt...

Entweder du läufst einfach über alle Parameter und vergleichst sie mit dem Namen und weist dennen dann den entsprechenden Wert zu...
Example:
Delphi-Quellcode:
Procedure ResolveParameter( Const Parameter: TParameter );
Begin
  If SameText( Parameter.Name, 'Benutzer'    ) Then Parameter.Value := 'TestUser'
  Else If SameText( Parameter.Name, 'BenutzerID'  ) Then Parameter.Value := 325
  Else If SameText( Parameter.Name, 'GruppenId'   ) Then Parameter.Value := 7667
  Else Raise Exception.Create( 'Unknown parameter: "' + Parameter.Name + '"' );
End;

Procedure ResolveParameters( Const Parameters: TParameters )
Var i: Integer;
Begin
  For i := 0 To Parameters.Count - 1 Do ResolveParameter( Parameters[ i ] );
End;

Procedure SqlMachwas;
Var Qry: TADOQuery;
Begin
  Qry := TADOQuery.Create( Nil );
  Try
    Qry.Connection := { Eine Connection };
    Qry.Prepared := True;
    Qry.SQL.Text := 'Select * From TabelleBenutzer '#13#10
                      + 'Where User = :Benutzer '#13#10
                      + ' Or Id = :BenutzerId '#13#10
                      + ' Or Group = :GruppenId ';
    ResolveParameters( Qry.Parameters );
    Qry.Open;
    { ... }
  Finally
    FreeAndNil( Qry );
  End;
End;
oder du machst sowas:
Code:
Declare @Benutzer Varchar( 255 )
Set @Benutzer = :Benutzer
/*

  /* Dein SQL Code :Benutzer dann ersetzt mit @Benutzer */

If NOT EXISTS( SELECT * FROM ADMN WHERE ADKNN>''USRRG'' AND ADDAT=@Benutzer )
INSERT ADMN VALUES(''USRRG1'',@Benutzer )

*/

Delphitechnisch dann pie mal daumen so:
Delphi-Quellcode:
Const
  cSQL = 'Declare @Benutzer Varchar( 255 ) '#13#10
          + 'Set @Benutzer = :Benutzer '#13#10
          + 'If NOT EXISTS( SELECT * FROM ADMN WHERE ADKNN>''USRRG'' AND ADDAT=@Benutzer ) '#13#10
          + 'INSERT ADMN VALUES(''USRRG1'',@Benutzer ) ';

{ * * * }

  ADOQry.Close;
  ADOQry.SQL.Clear;
  ADOQry.SQL.Text := cSQL
  ADOQry.Prepared := True; // erstellt Parameter
  ADOQry.Parameters.ParamValues[ 'Benutzer' ]:='Test2';
  ADOQry.ExecSQL;
Ich weiss jetzt auch nicht, ob die Exception Serverseitig oder Clientseitig kommt, wenn sie Serverseitig kommt, hilft dir dein Freund, und zwar ms. SQL Server Profiler, sofern du die entsprechenden Berechtigungen auf die DB hast..

Bye Christian
Christian
  Mit Zitat antworten Zitat
guidobrose
(Gast)

n/a Beiträge
 
#6

Re: ADOQuery mit Parametern - Ich kriegs nicht hin!

  Alt 21. Mär 2007, 08:04
Hallo zusammen,

also ich hatte die IF..ELSE Konstruktion im Query Analyzer ausprobiert und das funktionierte auf jeden Fall. Ob das jetzt eine geschickte Konstruktion ist oder nicht, sei mal dahin gestellt.

@Kedariodakon:

Du hast recht, ich hab es grad probiert. Zuerst nur den Tip von dataspider mit "prepared", das hat nicht funktioniert. Entscheidend ist gewesen, dass ich den Parameter mehr als einmal verwendet hat. Teile ich das auf zwei Parameter z.B. "Benutzer1" und "Benutzer2" auf, dann klappt es perfekt.

Danke dafür!
  Mit Zitat antworten Zitat
Benutzerbild von Kedariodakon
Kedariodakon

Registriert seit: 10. Sep 2004
Ort: Mönchengladbach
833 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: ADOQuery mit Parametern - Ich kriegs nicht hin!

  Alt 21. Mär 2007, 11:20
Zitat von guidobrose:
Teile ich das auf zwei Parameter z.B. "Benutzer1" und "Benutzer2" auf, dann klappt es perfekt.
Weitere Lösungen zu diesem Problem, welche mir besser erscheinen hab ich ja schon geposted

Bye Christian
Christian
  Mit Zitat antworten Zitat
guidobrose
(Gast)

n/a Beiträge
 
#8

Re: ADOQuery mit Parametern - Ich kriegs nicht hin!

  Alt 21. Mär 2007, 13:52
@Kedariodakon

Ich hab das jetzt auch ein klein wenig anders gelöst und kann damit auf die IF..ELSE Geschichte verzichten. Parameter verwende ich trotzdem, aber jetzt weiß ich ja wie
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:34 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