Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Програмно создаваемый SQL-запрос / 25 сообщений из 27, страница 1 из 2
11.02.2019, 20:33
    #39772506
Sensor230
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Програмно создаваемый SQL-запрос
Функции 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
11.02.2019, 20:59
    #39772511
RackotPro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Програмно создаваемый SQL-запрос
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
11.02.2019, 21:05
    #39772512
RackotPro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Програмно создаваемый SQL-запрос
Код: 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
11.02.2019, 21:06
    #39772513
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Програмно создаваемый SQL-запрос
RackotProпиши запрос так

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




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

Дык мало того что не ясно что у него там за проблема-то вообще, так и еше твой код принципиально работать не будет. :-)
Ибо кавычки таки нужны.
...
Рейтинг: 0 / 0
11.02.2019, 21:14
    #39772519
Sensor230
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Програмно создаваемый SQL-запрос
а про медведей - что их по идее тоже е...., а на деле они кусаются (старая русская поговорка)
...
Рейтинг: 0 / 0
11.02.2019, 21:17
    #39772520
RackotPro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Програмно создаваемый SQL-запрос
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
11.02.2019, 21:24
    #39772522
RackotPro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Програмно создаваемый SQL-запрос
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
11.02.2019, 21:49
    #39772525
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Програмно создаваемый SQL-запрос
RackotPro,

ну прямо открытие !
...
Рейтинг: 0 / 0
11.02.2019, 21:58
    #39772526
Gator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Програмно создаваемый SQL-запрос
Да уж. Профайлер - вообще слов незнакомое
...
Рейтинг: 0 / 0
11.02.2019, 22:59
    #39772541
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Програмно создаваемый SQL-запрос
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
11.02.2019, 23:36
    #39772546
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Програмно создаваемый SQL-запрос
RackotProпо поводу мой пример кода не будет работать, извольте, объясните почему?
21806855
Код: pascal
1.
TempParamUser := 'SELECT * FROM users WHERE Ulogin='+LoginUser;


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



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

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

Код: 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
12.02.2019, 10:16
    #39772635
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Програмно создаваемый SQL-запрос
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
12.02.2019, 12:08
    #39772723
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Програмно создаваемый SQL-запрос
wadmanSensor230TempParamUser:='''SELECT * FROM users WHERE Ulogin="'+LoginUser+'" ''';
Интересно, что будет если...
Код: pascal
1.
2.
	LoginUser := 'SomeUserName" or "1"="1';
	TempParamUser:='SELECT * FROM users WHERE Ulogin="'+LoginUser+'"';

...
Рейтинг: 0 / 0
12.02.2019, 12:24
    #39772738
RackotPro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Програмно создаваемый SQL-запрос
rgreat, да ладно вам про sql-инъекции)) этож ПО скорее всего для себя)) или для учёбы, пусть пишет так))) а потом создаст сайт и будут уже над ним глумиться, вставлять на сайт всякие непотребства)). Так процесс обучения станет более увлекательным)).
...
Рейтинг: 0 / 0
12.02.2019, 15:47
    #39772919
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Програмно создаваемый SQL-запрос
Док
Код: 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
12.02.2019, 17:36
    #39772973
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Програмно создаваемый SQL-запрос
_Vasilisk_,

ага. Человек азы не освоил, а ты ему спагетти подсовываешь :)
...
Рейтинг: 0 / 0
12.02.2019, 18:33
    #39773002
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Програмно создаваемый SQL-запрос
Докага. Человек азы не освоил, а ты ему спагетти подсовываешь :)Это я тебе :)
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Програмно создаваемый SQL-запрос / 25 сообщений из 27, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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