TADOQuery SQL.add () отправка / подготовка sql - PullRequest
2 голосов
/ 03 августа 2011

Обзор:
Я написал приложение, которое позволяет пользователю определять запрос, отправлять его на сервер и просматривать результаты. Программное обеспечение может работать на DB2 или MySQL.

Проблема:
У нас были проблемы в версии DB2, когда пользователь пытался выполнить запрос и обнаружил, что он не выполнен, поскольку его профиль пользователя отключен. Для выполнения запроса в DB2 (в IBM i) в строке подключения указываются имя и пароль профиля пользователя. Безопасность на сервере может указывать, что профиль пользователя отключается после двух или трех неверных входов.

Вопрос:
Я отладил приложение и обнаружил, что проблема заключается в том, что запрос был отправлен дважды. Если пароль пользователя неправильный, то, конечно, это приводит к отключению его профиля.

При дальнейшей проверке, когда я проверял журналы на сервере (при отладке построчно), я обнаружил, что запрос передается на сервер, когда вы вызываете TADOQuery.sql.add (), и снова когда активная собственность TADOQuery установлена ​​в true (это точка, в которой я ожидаю, что запрос будет отправлен на сервер). Вот пример кода, который я использую для выполнения запроса:

adoqry.active := false;
adoqry.sql.clear;
adoqry.sql.add('SELECT * FROM SOMEDB.SOMETABLE');
adoqry.active := true;

Поэтому мой вопрос довольно прост:
1. Почему метод TADOQuery.sql.add () отправляет запрос (когда ему просто нужно добавить sql в свойство sql TADOQuery)?
2. Что я могу сделать, чтобы предотвратить это? есть ли способ предотвратить отправку sql при вызове метода add ()?

Для тех из вас, кому нужна дополнительная информация о журналах, журналы точки выхода на IBM i показывают, что когда я вызываю adoqry.sql.add в приведенном выше примере, запрос запускается через «Database Server-SQL». Запрашивает «приложение точки выхода» через функцию «Подготовить и описать». Когда я вызываю adoqry.active: = true в приведенном выше примере, тот же запрос проходит через то же приложение точки выхода, но через функцию «Открыть / Описать».

Если вы не знакомы с IBM i, не беспокойтесь об этом - я просто включаю эту информацию в качестве доказательства того, что я проследил, что запрос был отправлен дважды. Настоящая проблема связана с обработкой sql.add () в TADOQuery.

1 Ответ

2 голосов
/ 04 августа 2011

Из вашего описания вашей проблемы, я полагаю, вы указываете ConnectionString ADOQuery.Это объединяет вход в базу данных с выполнением запроса.Вы обнаружили, что это имеет нежелательные побочные эффекты, когда учетные данные пользователя недействительны.

Отделите вход в базу данных от запроса с помощью ADOConnection.Укажите ConnectionString объекта ADOConnection и назначьте ADOConnection свойству ADOQuery.Connection.Таким образом, вы контролируете вход в базу данных и можете ловить входы с неверными учетными данными.Кроме того, метод ADOConnection.Open позволяет вам указать имя пользователя и пароль, чтобы вам не приходилось помещать их в ConnectionString.

Хотя это не отвечает на конкретные вопросы, этот подход поможет вам решить проблемупрофиль пользователя отключается путем отделения логина от выполнения запроса.

...