powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Програмно создаваемый SQL-запрос
27 сообщений из 27, показаны все 2 страниц
Програмно создаваемый SQL-запрос
    #39772506
Sensor230
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Функции RangUser сидящей в DataModule1 (dm1) передается параметр LoginUser из разных форм (формы динамические). По идее функция должна шарить по БД и возвращать должность интересующего сотрудника. Но на самом деле как и с белыми медведями -они кусаются.
Полагаю, что проблема в ковычках, т.к. при прямом присвоении значения TempParamUser все работает. Прошу помощи специалистов, а то мои молитвы до богов Delphi не доходят. Впал в ступор и буду благодарен за готовый код. Спасибо.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
function Tdm1.RangUser(LoginUser: string):string;
var TempParamUser : string;
begin
try
TempParamUser:='''SELECT * FROM users WHERE Ulogin="'+LoginUser+'" ''';
fmain.ADOQuery2.SQL.Clear;
fmain.ADOQuery2.SQL.Add (TempParamUser);
fmain.ADOQuery2.Active:=True;
//Result:=TempParamUser; -тестовый возврат строки запроса для визуального контроля синтаксиса
Result:=(fmain.ADOQuery2.FieldByName('UsRang').AsString);
except
on e:Exception do
end;
end;



Модератор: Как мне оформить свое сообщение?
...
Рейтинг: 0 / 0
Програмно создаваемый SQL-запрос
    #39772511
RackotPro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sensor230, попробую тебе помочь, но как мне кажется у тебя проблема с передачей параметров в sql. Поэтому предлагаю следующее решение


1. Используй табуляцию.
2. Оформляй код на форуме
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
function TForm1.RangUser(LoginUser: string):string;
var
  TempParamUser : string;
begin
  try
    TempParamUser := 'SELECT * FROM users WHERE Ulogin=:LoginUser';
    ADOQuery2.SQL.Clear;
    ADOQuery2.SQL.Text := TempParamUser;
    ADOQuery2.Parameters.ParamByName('LoginUser') := LoginUser;
    ADOQuery2.Active := True;
    //Result:=TempParamUser; -тестовый возврат строки запроса для визуального контроля синтаксиса
    Result:=(ADOQuery2.FieldByName('UsRang').AsString);
  except
    on e:Exception do
      MessageDlg(e.Message,mtError, [mbOK], 0);
  end;
end;



За оформление кода ставлю тебе 2 xD

По твоим ковычкам, самому запросу они не нужны достаточно
Код: sql
1.
'select column from table'

, если же всё же ты хочешь использовать свою ужасную конструкцию то пиши запрос так

Код: sql
1.
TempParamUser := 'SELECT * FROM users WHERE Ulogin='+LoginUser;
...
Рейтинг: 0 / 0
Програмно создаваемый SQL-запрос
    #39772512
RackotPro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
function TForm1.RangUser(LoginUser: string):string;
var
  TempParamUser : string;
begin
  try
    TempParamUser:='SELECT * FROM users WHERE Ulogin=:LoginUser';
    ADOQuery2.SQL.Clear;
    ADOQuery2.SQL.Text := TempParamUser;
    ADOQuery2.Parameters.ParamByName('LoginUser').Value := LoginUser;
    ADOQuery2.Active:=True;
    //Result:=TempParamUser; -тестовый возврат строки запроса для визуального контроля синтаксиса
    Result:=(ADOQuery2.FieldByName('UsRang').AsString);
  except
    on e:Exception do
      MessageDlg(e.Message,mtError, [mbOK], 0);
  end;
end;
...
Рейтинг: 0 / 0
Програмно создаваемый SQL-запрос
    #39772513
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RackotProпиши запрос так

Код: sql
1.
'WHERE Ulogin='+LoginUser;




Режим студент-студенту, что-ли?
...
Рейтинг: 0 / 0
Програмно создаваемый SQL-запрос
    #39772514
RackotPro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreat, Ну знаю так нельзя))) но я же код дал ему как нужно, по идее если так написать то работать будет же)))
...
Рейтинг: 0 / 0
Програмно создаваемый SQL-запрос
    #39772515
RackotPro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreat, тем более ответов в его теме нету, помогли бы)) а так да пусть почитает про sql инъекции.
...
Рейтинг: 0 / 0
Програмно создаваемый SQL-запрос
    #39772516
Sensor230
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RackotPro , по поводу оформления кода - сознаю свою вину, меру, степень, глубину... буду стараться. И большое спасибо за код , что то перемкнуло с этими ковычками и 2 недели ни с места. СПАСИБО!!!
...
Рейтинг: 0 / 0
Програмно создаваемый SQL-запрос
    #39772518
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RackotPro,

Дык мало того что не ясно что у него там за проблема-то вообще, так и еше твой код принципиально работать не будет. :-)
Ибо кавычки таки нужны.
...
Рейтинг: 0 / 0
Програмно создаваемый SQL-запрос
    #39772519
Sensor230
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а про медведей - что их по идее тоже е...., а на деле они кусаются (старая русская поговорка)
...
Рейтинг: 0 / 0
Програмно создаваемый SQL-запрос
    #39772520
RackotPro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreat, нуко нуко, ошибку у меня увидел???

Код: pascal
1.
2.
3.
4.
    TempParamUser:='SELECT * FROM users WHERE Ulogin=:LoginUser';
    ADOQuery2.SQL.Clear;
    ADOQuery2.SQL.Text := TempParamUser;
    ADOQuery2.Parameters.ParamByName('LoginUser').Value := LoginUser;



Либо я гений и мастер телепатии и один я понял, что проблема у него с кавычками, а вот по поводу мой пример кода не будет работать, извольте, объясните почему?

С помощью двоеточия объявляем в запросе (:LoginUser) входной параметр далее, берём функцию ParamByName и ищем наш параметр, изи рил толк синк эбаут мен.
...
Рейтинг: 0 / 0
Програмно создаваемый SQL-запрос
    #39772522
RackotPro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RackotPro,

так же отпишусь о своей грубой ошибке да кавычки правда нужны для сходного параметра, в любой IDE для любого sql. Мы пишем запросы вида Select FIO from People where Name = 'Маша'.

Так вот что бы в делфи присвоить ADOQuery2.SQL.Text тот же результат, нам нужно воспользоваться имеющейся в делфи конкатенацией ковычек, выглядит это следующим образом

Код: sql
1.
2.
  ShowMessage('SELECT * FROM users WHERE Ulogin=''' + 'Маша''');
  ShowMessage('SELECT * FROM users WHERE Ulogin=' + '''' + 'Маша' + '''');
...
Рейтинг: 0 / 0
Програмно создаваемый SQL-запрос
    #39772525
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
RackotPro,

ну прямо открытие !
...
Рейтинг: 0 / 0
Програмно создаваемый SQL-запрос
    #39772526
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да уж. Профайлер - вообще слов незнакомое
...
Рейтинг: 0 / 0
Програмно создаваемый SQL-запрос
    #39772541
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RackotProrgreat, нуко нуко, ошибку у меня увидел???

Код: pascal
1.
2.
3.
4.
    TempParamUser:='SELECT * FROM users WHERE Ulogin=:LoginUser';
    ADOQuery2.SQL.Clear;
    ADOQuery2.SQL.Text := TempParamUser;
    ADOQuery2.Parameters.ParamByName('LoginUser').Value := LoginUser;

Я не rgreat, но ошибку увидел - 2-я строка бессмысленна.
Я лично считаю код, эквивалентный вызову функции DoNothing, ошибочным.
...
Рейтинг: 0 / 0
Програмно создаваемый SQL-запрос
    #39772546
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RackotProпо поводу мой пример кода не будет работать, извольте, объясните почему?
21806855
Код: pascal
1.
TempParamUser := 'SELECT * FROM users WHERE Ulogin='+LoginUser;


Чтоб заработало в самой LoginUser - уже должны быть кавычки.
...
Рейтинг: 0 / 0
Програмно создаваемый SQL-запрос
    #39772594
Beltar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А нельзя в отладчике, или даже в профайлере сервера БД, если доступен, посмотреть результирующую строку запроса и средствами же сервера БД посмотреть, что в ней не так? Сообразить, что там у тебя склепалось, и почему оно не работает бывает сложно, а Delphi синтаксического анализа строки запроса не производит.
...
Рейтинг: 0 / 0
Програмно создаваемый SQL-запрос
    #39772614
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если путаешься в кавычках, то можно использовать QuotedStr()
Код: pascal
1.
  fmain.ADOQuery2.SQL.text := 'SELECT * FROM users WHERE Ulogin = ' + QuotedStr(LoginUser);



Но лучше, как уже подсказали выше - это параметрические запросы.

Еще совет: не используй *, а перечисляй поля.
...
Рейтинг: 0 / 0
Програмно создаваемый SQL-запрос
    #39772618
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sensor230TempParamUser:='''SELECT * FROM users WHERE Ulogin="'+LoginUser+'" ''';
Интересно, что будет если...
Код: pascal
1.
2.
	LoginUser := 'SomeUserName" or "1"="1';
	TempParamUser:='SELECT * FROM users WHERE Ulogin="'+LoginUser+'"';
...
Рейтинг: 0 / 0
Програмно создаваемый SQL-запрос
    #39772625
Sensor230
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем СПАСИБОЧКИ, что сдвинули меня с мертвой точки. Все заработало вот так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
function Tdm1.RangUser(LoginUser: string):string;
var TempParamUser, Tempito1: string;
begin
  try
    TempParamUser := 'SELECT * FROM users WHERE UsLogin=:LoginUserTemp1';
    ADOQuery2.SQL.Clear;
    ADOQuery2.SQL.Text := TempParamUser;
    ADOQuery2.Parameters.ParamByName('LoginUserTemp1').Value:= LoginUser;
    ADOQuery2.Active := True;
    Tempito1:=(ADOQuery2.FieldByName('UsRang').AsString);// почему то без этой промежуточной переменной не работает прямое
                                                        // присвоение не прокатывает
    Result:=Tempito1;
  except
    on e:Exception do
     // MessageDlg(e.Message,mtError, [mbOK], 0);
  end;
end;
...
Рейтинг: 0 / 0
Програмно создаваемый SQL-запрос
    #39772635
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sensor230,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
function Tdm1.RangUser(LoginUser: string):string;
var TempParamUser, Tempito1: string;
begin
  try
    TempParamUser := 'SELECT * FROM users WHERE UsLogin=:LoginUserTemp1';
//    ADOQuery2.SQL.Clear; //это - бессмыслица в контексте следующей строки кода 
    ADOQuery2.SQL.Text := TempParamUser;
    ADOQuery2.Prepare;//отпрепарируй запрос, а потом присваивай параметрам значения
    ADOQuery2.Parameters.ParamByName('LoginUserTemp1').Value:= LoginUser;
    ADOQuery2.Active := True;
    Result:= ADOQuery2.FieldByName('UsRang').AsString;
  except
    on e:Exception do
     // MessageDlg(e.Message,mtError, [mbOK], 0);
  end;
end;



Насчет "*" уже сказали, лучше перечисляй селектируемые поля по именам
...
Рейтинг: 0 / 0
Програмно создаваемый SQL-запрос
    #39772723
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanSensor230TempParamUser:='''SELECT * FROM users WHERE Ulogin="'+LoginUser+'" ''';
Интересно, что будет если...
Код: pascal
1.
2.
	LoginUser := 'SomeUserName" or "1"="1';
	TempParamUser:='SELECT * FROM users WHERE Ulogin="'+LoginUser+'"';

...
Рейтинг: 0 / 0
Програмно создаваемый SQL-запрос
    #39772738
RackotPro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreat, да ладно вам про sql-инъекции)) этож ПО скорее всего для себя)) или для учёбы, пусть пишет так))) а потом создаст сайт и будут уже над ним глумиться, вставлять на сайт всякие непотребства)). Так процесс обучения станет более увлекательным)).
...
Рейтинг: 0 / 0
Програмно создаваемый SQL-запрос
    #39772919
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док
Код: pascal
1.
 ADOQuery2.Prepare;//отпрепарируй запрос, а потом присваивай параметрам значения

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
procedure TADOQuery.QueryChanged(Sender: TObject);
begin
  if not (csLoading in ComponentState) then
    Close;
  CommandText := FSQL.Text;
end;

procedure TCustomADODataSet.SetCommandText(const Value: WideString);
begin
  if CommandText <> Value then
  begin
    CheckInactive;
    Command.CommandText := Value;
    PropertyChanged;
  end;
end;

procedure TADOCommand.SetCommandText(const Value: WideString);
begin
  FCommandText := Value;
  AssignCommandText(Value, ComponentLoading);
end;

procedure TADOCommand.AssignCommandText(const Value: WideString; Loading: Boolean);
begin
  if (CommandType = cmdText) and (Value <> '') and ParamCheck then
    InitParameters
  else
  begin
    CommandObject.CommandText := Value;
    if not Loading then Parameters.Clear;
  end;
end;

...
Рейтинг: 0 / 0
Програмно создаваемый SQL-запрос
    #39772973
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

ага. Человек азы не освоил, а ты ему спагетти подсовываешь :)
...
Рейтинг: 0 / 0
Програмно создаваемый SQL-запрос
    #39773002
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докага. Человек азы не освоил, а ты ему спагетти подсовываешь :)Это я тебе :)
...
Рейтинг: 0 / 0
Програмно создаваемый SQL-запрос
    #39773214
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Это я тебе :)
"Спасибо, друг!" © :)
...
Рейтинг: 0 / 0
Програмно создаваемый SQL-запрос
    #39773382
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док"Спасибо, друг!" © :)В двух словах - необходимость явного вызова Prepare я не видел ни в одних компонентах доступа. Он всегда вызывается неявно. Либо при модификации запроса, либо при вызове ParamByName
...
Рейтинг: 0 / 0
27 сообщений из 27, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Програмно создаваемый SQL-запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]