powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Авторизация пользователя в БД из клиентского приложения
6 сообщений из 6, страница 1 из 1
Авторизация пользователя в БД из клиентского приложения
    #39609148
Disite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго времени суток. Возникли некоторые трудности с взаимодействием клиентского приложения и soap-сервера.
Мне нужно реализовать простую авторизацию пользователя через web-сервис в БД. Для этого, на клиенте делаю форму с вводом логина и пароля, после чего, передаю их через soap connenction в soapDataModule с помощью удаленного метода, где проверяю корректность ввода.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
function TSoapDataModule.ConnectDB(login:string; password:string):string;
begin
 loginVal:= login;
 passwordVal:= password;
//loginVal,passwordVal - глобальные переменные
try
ADOConnection1.Connected:= True;
result:= 'Доступ к БД разрешен';
except on e:Exception do
result:= 'Ошибка' + e.Message;
end;
end;


Соответственно, в событии onWillConnect DataSetProvider'а вставляю данные учетки:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure TSoapDataModule.ADOConnection1WillConnect(
  Connection: TADOConnection; var ConnectionString, UserID,
  Password: WideString; var ConnectOptions: TConnectOption;
  var EventStatus: TEventStatus);
begin
UserID:=  loginVal;
Password:= passwordVal;
if EventStatus = esOK then Connection.LoginPrompt := False;
end;


На клиенте метод ConnectDB у меня вызывается только при входе в приложение. Для запроса данных использую
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure TForm1.Button2Click(Sender: TObject);
begin
Screen.Cursor:=crSQLWait;
    try
    ClientDataSet1.Active:= False;
    ClientDataSet1.Data:= ClientDataSet1.DataRequest('1');
    ClientDataSet1.Active:= True;
    finally
    Screen.Cursor:=crDefault;
    end;
end;


На сервере обрабатываю запрос так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
function TSoapDataModule.DataSetProvider1DataRequest(Sender: TObject;
  Input: OleVariant): OleVariant;
  var sqlQuery: string;
begin
with (Sender as TDataSetProvider)  do
    begin
       ADOQuery1.Active := False;
       ADOQuery1.SQL.Clear;

if Input = Null then
sqlQuery := 'SELECT * FROM cars' else
sqlQuery := 'SELECT * FROM cars WHERE id = ' + Input;
ADOQuery1.SQL.Add(sqlQuery);
ADOQuery1.Active := True;
Result:= Data;


Проблема в том, что при каждой активации запроса (ADOQuery1.Active := True;) вызывается onWillConnect и ему нужны данные учетки для предоставления результата запроса. Есть ли способ передавать данные учетной записи вместе с запросом данных (DataRequest)?
Заранее прошу прощения если где-то не так выразился. Только недавно начал изучать работу web-сервисов.
...
Рейтинг: 0 / 0
Авторизация пользователя в БД из клиентского приложения
    #39609158
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Disite,

ADOConnection1.LoginPromt := False ?
...
Рейтинг: 0 / 0
Авторизация пользователя в БД из клиентского приложения
    #39609186
Disite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gerasimenko,
где именно нужно ставить loginPromt := False? я ставил в ADOConnection1WillConnect и программа не требует каждый раз вводить учетку. Но в ADOConnection1WillConnect я только один раз передаю логин и пароль из клиентской формы, а по факту,ADOConnection1WillConnect вызывается при каждом запросе данных от клиента и ему уже не передается логин и пароль, ADOConnection1 их не сохраняет.
...
Рейтинг: 0 / 0
Авторизация пользователя в БД из клиентского приложения
    #39609263
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DisiteGerasimenko,
где именно нужно ставить loginPromt := False? я ставил в ADOConnection1WillConnect и программа не требует каждый раз вводить учетку. Но в ADOConnection1WillConnect я только один раз передаю логин и пароль из клиентской формы, а по факту,ADOConnection1WillConnect вызывается при каждом запросе данных от клиента и ему уже не передается логин и пароль, ADOConnection1 их не сохраняет.
Поставь один раз в дизайне.
...
Рейтинг: 0 / 0
Авторизация пользователя в БД из клиентского приложения
    #39609279
Disite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gerasimenko,
уже и в дизайне попробовал. Поменял немного метод ConnectDB но результат собственно тот же.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
function TSoapDataModule.ConnectDB(login:string; password:string):boolean;
begin
try
ADOConnection1.ConnectionString:= 'Provider=MSDAORA.1;Password='+ password+';User ID='+ login +'Data Source=carDB;Persist Security Info=True';
result:= 'Доступ к БД разрешен';
except on e:Exception do
result:= 'Ошибка' + e.Message;
end;
end;


Проблема то в том, что при каждом обращении клиента к данным на сервер через DataRequest, ConnectionString у ADOConnection сбрасывается на дефолтную, хотя через ConnectDB я меняю ConnectionString при корректной авторизации на клиенте. Может как то иначе можно выполнять такую авторизацию?
...
Рейтинг: 0 / 0
Авторизация пользователя в БД из клиентского приложения
    #39609304
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Disiteпри каждой активации запроса (ADOQuery1.Active := True;) вызывается onWillConnect

Другими словами, у тебя при закрытии твоего запроса почему-то делается отсоединении от сервера БД

Ищи в районе ADO - где и почему он или ты отключаешься от БД
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Авторизация пользователя в БД из клиентского приложения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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