Найдено 2 результата

danblack
Вт 23 июл 2013 14:29
Форум: PostgreSQL Data Access Components
Тема: Проблемы с кодировкой при включении UnpreparedExecute
Ответы: 1
Просмотры: 8548

Проблемы с кодировкой при включении UnpreparedExecute

Delphi XE2.
Последняя триальная версия PgDAC.
Кодировка БД: UTF-8.
Любая версия PostgreSQL

Код программы

Код: Выделить всё

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils, PgAccess, Winapi.Windows;

var
  Query: TPgQuery;
  Connection: TPgConnection;
  Start: Cardinal;
  Finish: Cardinal;
  Caption: string;
begin
  try
    Connection := TPgConnection.Create(nil);
    Connection.Server := '10.0.2.2';
    Connection.Database := 'main';
    Connection.Username := 'indy';
    Connection.Options.UseUnicode := True;
    Query := TPgQuery.Create(nil);
    Query.Connection := Connection;
    Query.SQL.SetText('SELECT ''тест'' AS test');
    Query.Open;
    Caption := Query.FieldByName('TEST').AsString;
    MessageBox(0, PWideChar(Caption), '', MB_OK);
    Query.Close;
    Query.Options.UnpreparedExecute := True;
    Query.Open;
    // При включении UnpreparedExecute запрос возвращает данные в неверной кодировке
    Caption := Query.FieldByName('TEST').AsString; // 'тест'
    MessageBox(0, PWideChar(Caption), '', MB_OK);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
При включении UnpreparedExecute запрос возвращает данные в неверной кодировке. См. код.
danblack
Вт 23 июл 2013 04:57
Форум: PostgreSQL Data Access Components
Тема: Странное зависание TPgQuery при выполнении запроса
Ответы: 1
Просмотры: 8865

Странное зависание TPgQuery при выполнении запроса

Есть код

Код: Выделить всё

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils, PgAccess, Winapi.Windows;

var
  Query: TPgQuery;
  Connection: TPgConnection;
  Start: Cardinal;
  Finish: Cardinal;
  Caption: string;
begin
  try
    Connection := TPgConnection.Create(nil);
    Connection.Server := '10.10.1.10';
    Connection.Database := 'main';
    Connection.Username := 'denis';
    Connection.Options.UseUnicode := True;
    Query := TPgQuery.Create(nil);
    Query.Connection := Connection;
    Query.Options.UnpreparedExecute := True;
    Query.SQL.Text := 'SET client_min_messages = FATAL;';
    Query.ExecSQL;
    Query.SQL.Text := 'Длинный запрос';
    Start := GetTickCount;
    Query.ExecSQL;
    Finish := GetTickCount;
    Caption := IntToStr(Finish - Start);
    MessageBox(0, PWideChar(Caption), '', MB_OK); // duration: 6500 ms
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
В нем выполняется большой запрос к базе данных, в котором используются хранимые процедуры.
Хранимые процедуры генерируют логирующую информацию через
RAISE LOG 'something';
Время выполнение запроса, судя по логам базы данных ~2000 мс.
Выполнение строки Query.ExecSQL; в коде занимает 6-7 секунд.
Непонятно, на что тратится столько времени.
Если убрать логирование в хранимых процедурах, то строка Query.ExecSQL; выполняется без тормозов.
Использую триальный PgDAC, так что сам код посмотреть не могу. Отладка (свойство Debug), на сколько я понял, в триальной версии тоже недоступна.
Пробовал сэмулировать ситуацию на простых процедурах/данных - не получилось. Поэтому приходится ограничиваться только словесным описанием проблемы.

Как мне понять, где PgQuery тормозит, чтобы, возможно, что-то донастроить или обойти эту проблему? Есть ли какие-нибудь возможности это сделать не имея исходного кода?