Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi UPDATE funktioniert nicht mit Variabel als Spaltenname (https://www.delphipraxis.net/106798-update-funktioniert-nicht-mit-variabel-als-spaltenname.html)

daniel71 16. Jan 2008 21:50

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:
  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;
oder das die fehlermeldung syntaxfelhler in der nähe von "wert von zKontaktSpalte" ausgibt
Delphi-Quellcode:
  with Form1.ADOQuery5 do Begin
   Close;
   SQL.Text:='UPDATE '+
              '[Kontakt_TP] '+
             'SET '+
              ''''+zKontaktSpalte+''' = '''+zKontaktWert+''' '+ 
             'WHERE '+
              'PBX_Num_Am = '''zPBXNumAm''' ';
   ExecSQL
  end;
das hier funktioniert
Delphi-Quellcode:
  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;
vielen dank für eure hilfe

DeddyH 16. Jan 2008 21:54

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:
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;
[/edit]

daniel71 16. Jan 2008 22:46

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;

Bernhard Geyer 17. Jan 2008 06:25

Re: UPDATE funktioniert nicht mit Variabel als Spaltenname
 
Zitat:

Zitat von DeddyH
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.

Ganz einfach: Die SQL-Parser auf Serverseite unterstützen sowas nicht, da mit solch einem Freiheitsgrad prepared Statements nicht möglich/sinnvoll wären. Da je nachdem ob das Feld eine Index hat oder nicht der Queryplan geändert werden müsste was dem Prepared-Gedanken (Performance-Gewinn) entgegensteht.

alzaimar 17. Jan 2008 09:27

Re: UPDATE funktioniert nicht mit Variabel als Spaltenname
 
Zitat:

Zitat von daniel71
Es funtioniert, nur wird die ganze spalte mit leerzeichen gefüllt.

Das ist eine Macke in ADO.

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:
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;
Es gibt bestimmt eine bessere Lösung, aber ich hab damals keine gefunden und mir damit geholfen. Seitdem klappts wieder mit der Nachbarin ;-)


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