Компонент TNewQuery

Вернуться к оглавлению

Аналог TQuery и TADOQuery, расширяющий их функциональность. Добавляет новые способы доступа к полям, обеспечивает журналирование выполнявшихся запросов с целью сохранения списка выполнявшихся запросов в момент возникновения исключительной ситуации. В зависимости от символов условной компиляции, компилируется как наследник либо TODBCQuery, либо TADOQuery, либо TQuery, что позволяет обеспечить определённую степень гибкости: перекомпиляция проекта с другими символами условной компиляции - и вы получаете приложение, работающее с базой данных через другого провайдера (что позволяет сравнить их между собой и выбрать наиболее подходящий, например).

Компонент разрабатывался для Delphi 5, но работает так же и в Delphi 6, и должен работать в Delphi 7. В более поздних версиях Delphi и его клонов не тестировался. Модуль называется AdoSqlUnit, т.к. первоначально планировалась работа только через ADO.

Подробное описание

Основная (первоначальная) цель разработки компонента TNewQuery - это протоколирование всех выполняющихся запросов к базе данных, с возможностью выгрузки всех последних выполнявшихся запросов в текстовой файл в случае возникновения аварийной ситуации, что значительно упрощает отладку SQL-запросов в приложении.

Символы условной компиляции

Здесь приведены символы условной компиляции, которые могут быть добавлены в опции проекта (Project | Options | закладка Directories/Conditionals | поле conditional Defines). Учтите, что после изменения набора символов условной компиляции, для перекомпилирования проекта следует использовать команду Build Project или Build All (и ни в коем случае не Compile!)
Символ условной компиялции Описание
ODBC_DIRECT Работа идёт через TODBCQuery (компонент базы данных TODBCDatabase, соединение по умолчанию для вновь создаваемых объектов TNewQuery - DefaultODBCDataSource). Т.е. TNewQuery в этом случае используется для работы через ODBC-драйвера, минуя прочих посредников. Должен быть объявлен только один из этих трёх символов (взаимно исключают друг друга). Если не объявлен ни один, по умолчанию предполагается, что включен ADO_DB.
ADO_DB Работа идёт через TADOQuery.
NOADO_NOODBC или BDE_DB Работа идет через TQuery. Это обычно BDE, хотя такой метод давно считается устаревшим, но продолжает поддерживаться для старых приложений.


  
TNewQuery  

Компонент TNewQuery.

В зависимости от символов условной компиляции, TNewQuery производится от одного из классов TODBCQuery, TADOQuery или TQuery, и, соответственно, наследует те или иные возможности (свойства, методы, события) родительского класса. Если планируется (или хотя бы предполагается) возможность гибкого переключения с одного предка на другой, то лучше избегать использования напрямую наследуемых возможностей, ели они не переопределены в самом классе TNewQuery. Ниже приведены свойства и методы самого класса TNewQuery, в том числе переобращающиеся к свойствам и методам классов-предков. Лучше всего обойтись именно этим набором средств, иначе в своём коде придётся обеспечивать собственные ветки для условной компиляции с использованием директив препроцессора {$IFDEF ...}, например.

Для присваивания текста SQL-запроса, кроме унаследованного от предка свойства SQL.Text, может использоваться собственное свойство Text, позволяющее упростить кодирование перехода на новую строку. (Автор пришёл к выводу, что использование свойства SQL с методом Add, предлагаемое стандартными компонентами Delphi - это вообще неудачное решение, из-за необходимости заключать каждую строку в круглые скобки. И даже прямое использование SQL.Text с присваиванием конкатенации строк выглядит менее громоздко).

Обратите внимание на дополнительные возможности по форматированию SQL-запросов в коде исходной программы, предоставляемые функциями модуля UtilsUnit. Помимо функций преобразования в строку из нескольких типов данных (DateToSQL, StrToSQL), функций условного формирования текста (IfThenElse, NullIfEmpty и т.п.), очень полезными могут оказаться функции SqlUpd, SqlIns, SqlUpdIns, позволяющие оформлять унифицированным образом SQL-запросы на вставку и обновление записей в таблицу базы данных, при этом способствуя уменьшению количества ошибок в написании SQL-кода и улучшению форматирования кода в тексте программы.

Свойства и методы времени исполнения компонента TNewQuery (секция PUBLIC).

Имя свойства / декларация метода Тип Только чтение Значение свойства по умолчанию Описание
CanCancel Boolean R/W TRUE TRUE, если запрос может быть отменен.
procedure ExecSQL;       Выполняет запрос без возврата результатов. Т.е., запрос не содержит операторов SELECT, возвращающих результат.
procedure Open;       Выполняет запрос, возвращающий один или несколько (такое возможно в случае ODBC_DIRECT) результатов.
procedure Close;       Закрывает запрос. Запрос должен быть закрыт до того, как начнёт выполняться следующий.
function Cancel: Boolean;       Отменяет запрос. Отмена не выполняется, если поле CanCancel
содержит FALSE (значение по умолчанию TRUE).
IField[ const Name: String ] Integer R   Чтение целочисленного значения поля по имени поля, практически эквивалентно для TADOQuery и TQuery обращению .FieldByName( Name ) as Integer, но в случае, когда поле имеет значение NULL, не вызывает исключение, а возвращает 0.
BoolField[ const Name: String ] Boolean R   Чтение булевского значения поля по имени поля. Не реализовано для ODBC_DIRECT, т.к. в TODBCQuery нет работы с булевыми полями.
SField[ const Name: String ] String R   Чтение значения поля как строки. В случае, когда поле имеет значение NULL, возвращает пустую строку. Для не-строчных типов данных обеспечивается автоматическая конверсия данных в строку в соответствии с типом поля.
FField[ const Name: String ] Double R   Чтение значения поля как вещественного числа удвоенной точности. В случае NULL возвращается 0.
DField[ const Name: String ] TDateTime R   Аналогично FField (т.к. тип TDateTime эквивалентен Double).
BField[ const Name: String ] TStream R   Доступ к BLOB-полю по имени. Не реализован для ODBC_DIRECT.
IFieldN[ Idx: Integer ] Integer R   Чтение целочисленного значения поля по индексу поля.
BoolFieldN[ Idx: Integer ] Boolean R   Чтение булевого значения поля по индексу поля.
SFieldN[ Idx: Integer ] String R   Чтение строкового значения поля по индексу поля. Для не-строчных типов данных обеспечивается автоматическая конверсия данных в строку в соответствии с типом поля.
FFieldN[ Idx: Integer ] Double R   Чтение вещественного значения поля по индексу.
DFieldN[ Idx: Integer ] TDateTime R   Аналогично предыдущему.
BFieldN[ Idx: Integer ] TStream R   Доступ к BLOB-полю по индексу.
NullField[ const Name: String ] Boolean R   Проверка того, что поле имеет значение NULL (по имени поля).
NullFieldN[ Idx: Integer ] Boolean R   Проверка того, что поле имеет значение NULL (по индексу поля).
IParam[ const Name: String ] Integer R/W   Позволяет изменить значение параметра по имени параметра (имя параметра не содержит символ двоеточия).
SParam[ const Name: String ] String R/W   Для изменения строкового параметра.
FParam[ const Name: String ] Double R/W   Для изменения вещественного параметра.
DParam[ const Name: String ] TDateTime R/W   Аналогично FParam.
BParam[ const Name: String ] TStream R   Позволяет установить значение BLOB-параметра путём записи данных в возвращаемый поток. Работа с BLOB-полями не реализована в ODBC_DIRECT.
VParam[ const Name: String ] Variant R/W   Позволяет установить значение параметра из переменной типа Variant.
procedure NullParam( const Name: String; FieldType: TFieldType = ftUnknown );       Устанавливает в качестве значения параметра значение NULL. Обязательно следует указывать тип параметра.
FieldCount Integer R   Возвращает число полей в результатах запроса (в текущем наборе результатов, для ODBC_DIRECT).
FieldNames[ Idx: Integer ] String R   Имена полей по их индексам от 0 до FieldCount-1.
Fieldtypes[ Idx: Integer ] TFieldType R   Типы данных полей по их индексам.
SaveLog Boolean R/W TRUE Сохранять или нет запрос в журнале сохранённых запросов. Отключать сохранение имеет смысл для коротких и часто выполняющихся утилитарных запросов, не нуждающихся в отладке.
Text String R/W   В отличие от доступа к SQL.Text, при присваивании нового текста запроса через данное свойства, все символы '!' заменяются на символ возврата каретки #13. Это может чуть сократить код, включающий создание SQL-запроса в тексте приложения, например:
Q.Text := 'SELECT * FROM MyTable'
    + '!WHERE Family IS NOT NULL';


(C) by Vladimir Kladov, 2000-2010