Выполнение SQL запроса к базам данных.
C/C++ -
HRESULT _stdcall DBQuery([in] enum APIDBType DBType, [in] BSTR Request, [in, defaultvalue(0)] long ThreadPrior, [out, retval] BSTR* Value);
HRESULT _stdcall DBQuery2([in] enum APIDBType DBType, [in] BSTR Request, [in] long Limit, [in] long Offset, [in] long ThreadPrior, [out] VARIANT_BOOL* Cancel, [out] VARIANT_BOOL* Timeout, [out] long* Rows, [out, retval] BSTR* Value);
Delphi -
function DBQuery(DBType: APIDBType; const Request: WideString; ThreadPrior: Integer): WideString; safecall;
function DBQuery2(DBType: APIDBType; const Request: WideString; Limit: Integer;
Offset: Integer; ThreadPrior: Integer; out Cancel: WordBool;
out Timeout: WordBool; out Rows: Integer): WideString; safecall;
Возвращаемое значение - Результат выполнения запроса ввиде XML данных. Данные выдаются ввиде текста.
DBType - задается база данных:
• | APIDBType_Main = 0. Локальная база данных, тип SQLite. Файл main.db3. Содержит текущие данные биллинга и внешних счетчиков. |
• | APIDBType_ProxyCache = 1. Индекс кеша прокси сервера, тип SQLite. Файл proxy.db3. |
• | APIDBType_Log = 2. Локальная база данных журналов, тип SQLite. Файл log.db3. Содержит всю историю работы различных служб программы. |
• | APIDBType_Ext = 3. Внешняя база данных, тип Microsoft SQL server. Обращение возможно, если работа с внешней базой данных была настроена. |
• | APIDBType_Profile = 4. Локальная база данных профилей, тип SQLite. Файл profile.db3. |
Request - SQL запрос. Допускается задавать комбинированный запрос из нескольких SQL конструкций. Для SQLite запросы отделяются ";", для MSSQL ключевым словом GO. Но результат будет выведен только один.
Каждая колонка выводимых данных представляет собой элемент с именем Row, каждая ячейка таблицы - атрибут. Имя атрибута берется из имени колонки таблицы запроса.
ThreadPrior - Изменение приоритета потока. Допустимое значение - целое от -2 до 2. Если 0, то приоритет меняться не будет. Понижение приоритета может быть полезно при выполнении длительных по времени запросов для того, что-бы не нарушать нормальную работу других служб программы.
DBQuery2 - расширенная версия функции DBQuery. В DBQuery при таймауте или прерывании запроса выдается исключение, а в DBQuery2 выставляются признаки Cancel и Timeout. Это позволяет отдельно произвести обработку этих результатов.
Для DBQuery2 также имеется возможность задавать сокращенную выборку -
Limit - максимальное количество строк возвращаемых данных.
Offset - выводить, начиная с заданной строки. Нумерация с "0".
Rows - возвращается общее количество строк всего запроса. Этот параметр, например, может использоваться при выполнении постраничного вывода для определения количества страниц. Если -1, то это означает, что в процессе выполнения запроса общее количество строк определить невозможно, но данных больше, чем задано в Limit.
В портале имеется страница диагностики Admin/Query.aspx, с которой можно сделать запрос через DBQuery2 с различными параметрами и получить вывод в табличном виде.
Замечания по форматам данных.
Выводимые данные должны содержать только символы, разрешенные для XML атрибутов, иначе в атрибуте будет выдано сообщение об ошибке <Error: Incorrect symbols>.
В базах данных Traffic Inspector везде используется системное время (по Гринвичу, универсальное, UTC). Если в SQL запросе используется время, то надо локальное время в нем преобразовать в системное. Также в выходных данных системное время надо преобразовать в локальное. Для выходных данных типа даты или времени используется формат ISO 8601 (см. функции-помощники для работы с этим форматом).
Для времени и даты в SQL запросе используется строковое выражение -
• | Для SQLite внутренний формат даты и времени типа "2005-02-25 01:02:03". |
• | Для MSSQL см. документацию. Может быть любой поддерживаемый формат, например, ISO 8601, он удобен тем, что не завязан на региональные настройки. |
Замечания по SQLite.
Описание SQLite можно найти на сайте проекта.
В Traffic Inspector для SQLite дополнительно к стандартным сделана реализация некоторых функций от Microsoft SQL server - GetDate, DatePart, DateAdd, DateDiff. Это удобно для формирования универсальных запросов.
Имеется возможность подключить любую другую базу данных. Для этого используйте запрос к любой базе SQLite (кроме APIDBType_Ext) и командой Attach подключите дополнительную базу. В дальнейшем база будет подключена в течение всего соединения интерфейса ITrafInspAdmin для запроса данного типа.
Текущая страница справки: http://help.smart-soft.ru/doc20/index.html?sdk_dbquery.htm