AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi UPDATE funktioniert nicht mit Variabel als Spaltenname
Thema durchsuchen
Ansicht
Themen-Optionen

UPDATE funktioniert nicht mit Variabel als Spaltenname

Ein Thema von daniel71 · begonnen am 16. Jan 2008 · letzter Beitrag vom 17. Jan 2008
Antwort Antwort
daniel71

Registriert seit: 27. Sep 2007
38 Beiträge
 
Delphi XE Professional
 
#1

UPDATE funktioniert nicht mit Variabel als Spaltenname

  Alt 16. Jan 2008, 22:50
Datenbank: MSSQL • Version: 2005 • Zugriff über: ADOConnection
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#2

Re: UPDATE funktioniert nicht mit Variabel als Spaltenname

  Alt 16. Jan 2008, 22:54
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]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
daniel71

Registriert seit: 27. Sep 2007
38 Beiträge
 
Delphi XE Professional
 
#3

Re: UPDATE funktioniert nicht mit Variabel als Spaltenname

  Alt 16. Jan 2008, 23:46
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;
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: UPDATE funktioniert nicht mit Variabel als Spaltenname

  Alt 17. Jan 2008, 07:25
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: UPDATE funktioniert nicht mit Variabel als Spaltenname

  Alt 17. Jan 2008, 10:27
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
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  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 04:39 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