Autor Beitrag
sharam
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Do 26.02.04 15:09 
Hi,

ich versuche in meinem Programm an einer 'CASE' Anweisung zwei Parameter mittels 'ParamByName' zu übergeben. Einer dieser Parameter ist der Spaltenname selbst, in dem dann nach dem zweiten Parameter gesucht werden soll. Wie muß ich mit ParamByName den SpaltenNamen übergeben. Es handelt sich ja hierbei nicht unbedingt um einen String, habe den Datantyp auch schon als ftVariant deklariert.

Bsp.:

Übergabe der beiden Parameter an die Fkt. 'getSQLdata(..)' durch:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
......
           sql.add(getSQLData(001));
           Parameters.ParamByName('spalte').DataType := ftstring;     <--Der spaltenName 
           Parameters.ParamByName('spalte').Value := spaltenName;
           Parameters.ParamByName('wert').DataType := ftstring;      <---Wert in der Spalte
           Parameters.ParamByName('wert').Value := wert;
......


function getSQLData(nr:integer) : string;
begin
   case (nr) of
       001 : Result := 'SELECT * FROM WHERE spalte = :wert');  <---  Habe es auch schon mit :spalte versucht
   end;
end;



Habe es auch direkt versucht mit sql.add('SELECT * FROM tableName WHERE ' + spaltenName + ' =' + wert);
Was mach ich den hier falsch? Erhalte leider immer die Fehlermeldung 'Parameter Spalte nicht gefunden'.

Vielen Dank im Voraus

Sharam

Moderiert von user profile iconPeter Lustig: Delphi-Tags hinzugefügt
CenBells
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1547

Win 7
Delphi XE5 Pro
BeitragVerfasst: Do 26.02.04 15:37 
Hallo,

wenn du eine case anweisung hast, würde ich bei den case-fällen direkt das sql schreiben.
also
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
case x of
1: sql.add('SELECT * FROM tableName WHERE spalte1 = :' + wert);
2: sql.add('SELECT * FROM tableName WHERE spalte2 = :' + wert);
end;
parambyname('wert').AsString := Wert;


Die meisten datenbanken unterstützen keine variablen spalten oder auch tabellennamen. Diese müssen beim eingeben bereits bekannt sein.

Gruß
Ken

_________________
Eine Klasse beschreibt die Struktur und das Verhalten einer Menge gleichartiger Objekte.
sharam Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Do 26.02.04 17:29 
Hallo Ken,

vielen Dank für die schnelle Antwort.

Heißt das, dass der Benutzer eines Programms nicht neue Spalten in einer DB-Tabelle einfügen kann, bzw. müssen diese schon vorher in der DB vorhanden sein, um dann je nach Wahl des Benutzers angezeigt werden zu können?


ausblenden Delphi-Quelltext
1:
2:
3:
sql.Add('SELECT * FROM tableName WHERE firma = :' + wert);
Parameters.ParamByName('wert').DataType := ftstring;
Parameters.ParamByName('wert').Value := wert;


Der obige Versuch klappt bei mir nur, wenn ich die 'SELECT'-Anweisung in einer 'CASE'-Anweisung übertrage, wie bei deinem Beispiel. Kann man das denn nicht auch direkt auführen. Erhalte die Fehlermeldung 'wert nicht gefunden'. Benutze TADOQuery, daher auch der Parameter vor ParamByName.

MFG

Sharam
(D7 mit MS SQL 2000)
CenBells
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1547

Win 7
Delphi XE5 Pro
BeitragVerfasst: Do 26.02.04 17:46 
Hallo,

Dein Quellcode enthält einen kleinen fehler.
ausblenden Delphi-Quelltext
1:
sql.Add('SELECT * FROM tableName WHERE firma = :' + wert);					

Er muss folgendermaßen aussehen
ausblenden Delphi-Quelltext
1:
sql.Add('SELECT * FROM tableName WHERE firma = <span style="font-weight: bold">:wert'</span>);					


Gruß
Ken

_________________
Eine Klasse beschreibt die Struktur und das Verhalten einer Menge gleichartiger Objekte.