В операторе SQL не заключайте имена полей в двойные кавычки. Если в имени поля есть пробелы (или другие специальные символы, или зарезервированные имена), используйте вместо этого квадратные скобки. И так как имя вашего поля предоставляется вводом string
, убедитесь, что его санировали, прежде чем использовать, чтобы избежать любых атак SQL Injection.
Кроме того, вы должны использовать одинарные кавычки вместо двойных - кавычки вокруг строковых литералов, которые используются в операторах SQL:
if Pos(';', value) > 0 or Pos(',', value) > 0 then raise ...;
ADOQuery1.SQL.Text := 'SELECT [' + value + '] FROM TblRoom WHERE RoomType=' + QuotedStr(Room) + ' AND HotelName = ' + QuotedStr(Hotel);
ADOQuery1.Open;
...
Более безопасным вариантом использования литералов является использование параметров вместо этого (как показывает @ whosrdaddy's answer ), за исключением того, что Имена полей в предложении SELECT
не могут быть параметризованы, поэтому часть SQL все равно должна будет использовать конкатенацию строк (после очистки строки):
if Pos(';', value) > 0 or Pos(',', value) > 0 then raise ...;
ADOQuery1.ParamCheck := True;
ADOQuery1.SQL.Text := 'SELECT [' + value + '] FROM TblRoom WHERE RoomType=:Room AND HotelName=:Hotel';
ADOQuery1.Parameters.ParamByName('Room').Value := room;
ADOQuery1.Parameters.ParamByName('Hotel').Value := hotel;
ADOQuery1.Open;
...