![]() |
Datenbank: MSSQL • Version: 2005 • Zugriff über: ADOConnection
UPDATE funktioniert nicht mit Variabel als Spaltenname
Hallo
Kann mir jemand sagen wiso das nicht funktioniert?
Delphi-Quellcode:
oder das die fehlermeldung syntaxfelhler in der nähe von "wert von zKontaktSpalte" ausgibt
with Form1.ADOQuery5 do Begin
Close; SQL.Text:='UPDATE '+ '[Kontakt_TP] '+ 'SET '+ ':pzKontaktSpalte = :pzKontaktWert '+ 'WHERE '+ 'PBX_Num_Am = :pzPBXNumAm '; ParamCheck := True; Parameters.ParamByName('pzKontaktSpalte').Value := zKontaktSpalte; Parameters.ParamByName('pzKontaktWert').Value := zKontaktWert; Parameters.ParamByName('pzPBXNumAm').Value := zPBXNumAm; ExecSQL; end;
Delphi-Quellcode:
das hier funktioniert
with Form1.ADOQuery5 do Begin
Close; SQL.Text:='UPDATE '+ '[Kontakt_TP] '+ 'SET '+ ''''+zKontaktSpalte+''' = '''+zKontaktWert+''' '+ 'WHERE '+ 'PBX_Num_Am = '''zPBXNumAm''' '; ExecSQL end;
Delphi-Quellcode:
vielen dank für eure hilfe
with Form1.ADOQuery5 do Begin
Close; SQL.Text:='UPDATE '+ '[Kontakt_TP] '+ 'SET '+ 'Adresse = :pzKontaktWert '+ 'WHERE '+ 'PBX_Num_Am = :pzPBXNumAm '; ParamCheck := True; Parameters.ParamByName('pzKontaktWert').Value := zKontaktWert; Parameters.ParamByName('pzPBXNumAm').Value := zPBXNumAm; ExecSQL; end; |
Re: UPDATE funktioniert nicht mit Variabel als Spaltenname
Das funktioniert deshalb nicht, weil Parameter nur für Werte, nicht aber für Feldbezeichner zugelassen sind. Es gab da kürzlich einen Thread dazu, ich finde ihn nur auf die Schnelle nicht wieder.
[edit] Das hier könnte funktionieren:
Delphi-Quellcode:
[/edit]
with Form1.ADOQuery5 do Begin
Close; SQL.Text:=Format('UPDATE [Kontakt_TP] '+ 'SET '+ '%s = :pzKontaktWert '+ 'WHERE '+ 'PBX_Num_Am = :pzPBXNumAm ',[zKontaktSpalte]); ParamCheck := True; Parameters.ParamByName('pzKontaktWert').Value := zKontaktWert; Parameters.ParamByName('pzPBXNumAm').Value := zPBXNumAm; ExecSQL; end; |
Re: UPDATE funktioniert nicht mit Variabel als Spaltenname
Hallo DeddyH
Vielen dank für die antwort. Es funtioniert, nur wird die ganze spalte mit leerzeichen gefüllt. z.B Ich fülle spalte: Adresse nvarchar(100) mit dem eintrag: Hauptstr. aus. lese ich diese wieder aus bekomme ich "Hauptstr.________________________" Hauptstr. + 91 leerzeichen Das sieht so ziemlich unschön aus wenn ich den wert in eine grafik einfüge. Gibt es einen weg dies zu verhindern? Ich glaube es liegt aber am Parameter :pzKontaktWert denn so funktioniert es
Delphi-Quellcode:
with Form1.ADOQuery5 do Begin
Close; SQL.Text:=Format('UPDATE [Kontakt_TP] '+ 'SET '+ '%s = '''+zKontaktWert+''' '+ 'WHERE '+ 'PBX_Num_Am = :pzPBXNumAm ',[zKontaktSpalte]); ParamCheck := True; Parameters.ParamByName('pzPBXNumAm').Value := zPBXNumAm; ExecSQL; end; |
Re: UPDATE funktioniert nicht mit Variabel als Spaltenname
Zitat:
|
Re: UPDATE funktioniert nicht mit Variabel als Spaltenname
Zitat:
Abhilfe: Du erzeugst Dir eine Stringliste mit allen Feldnamen, die als NVARCHAR deklariert sind (hier z.B. als privates Feld fWideCharParams: TStringlist). Die werden nämlich von ADO (oder dem ADO-Wrapper von Delphi?) fälschlicherweise als NCHAR ausgegeben. Im OnWillExecute-Ereignis der ADOConnection ersetzt Du den falschen Typen durch adVarWChar, und zwar so:
Delphi-Quellcode:
Es gibt bestimmt eine bessere Lösung, aber ich hab damals keine gefunden und mir damit geholfen. Seitdem klappts wieder mit der Nachbarin ;-)
Procedure TDM.MyADOConnectionWillExecute(Connection: TADOConnection;
Var CommandText: WideString; Var CursorType: TCursorType; Var LockType: TADOLockType; Var CommandType: TCommandType; Var ExecuteOptions: TExecuteOptions; Var EventStatus: TEventStatus; Const Command: _Command; Const Recordset: _Recordset); Var i: Integer; Begin With Command.Parameters Do For i := 0 To Count - 1 Do If fWideCharParams.IndexOf(AnsiUpperCase(Item[i].Name)) <> -1 Then Item[i].Type_ := adVarWChar; End; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:16 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