![]() |
Datenbank: MSSQL • Zugriff über: ADO
ADOQuery mit Parametern - Ich kriegs nicht hin!
Hallo,
ich habe zwar schon einige Beiträge zu dem Thema gefunden, aber ich krieg es trotzdem nicht hin.
Delphi-Quellcode:
Ich habe da schon einiges ausprobiert, aber es wird immer eine exception ausgelöst
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; "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 |
Re: ADOQuery mit Parametern - Ich kriegs nicht hin!
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; |
Re: ADOQuery mit Parametern - Ich kriegs nicht hin!
Zitat:
|
Re: ADOQuery mit Parametern - Ich kriegs nicht hin!
Hi,
IMHO muss man die Parameter nicht erzeugen. Ein Prepare erzeugt diese automatisch. EDIT
Delphi-Quellcode:
/EDIT
ADOQry.Close;
ADOQry.SQL.Clear; ADOQry.SQL.Add(...; ADOQry.Prepared := True; // erstellt Parameter ADOQry.Parameters.ParamValues['Benutzer']:='Test2'; ADOQry.ExecSQL; Cu, Frank |
Re: ADOQuery mit Parametern - Ich kriegs nicht hin!
Zitat:
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:
:cyclops: Ich denke ich hab den Fehler...
Delphi-Quellcode:
Du verwendest mehr als einmal den Parameter!
ADOQry.Parameters.ParamValues['Benutzer']:='Test2';
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:
oder du machst sowas:
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;
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:
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..
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; Bye Christian |
Re: ADOQuery mit Parametern - Ich kriegs nicht hin!
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! |
Re: ADOQuery mit Parametern - Ich kriegs nicht hin!
Zitat:
Bye Christian |
Re: ADOQuery mit Parametern - Ich kriegs nicht hin!
@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 :wink: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:52 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