Страница 1 из 1

pFIBQuery1 BatchOutputRawFile не выгружает

Добавлено: 31 июл 2006, 12:11
Guard
Проблемы с BatchOutputRawFile.
Делаю выгрузку в файл. Выгружаются похоже только заголовки ~14 байт :cry: (Delphi 7 + FIBPlus 6.4.1)

pFIBQuery1.SQL.Add('SELECT * FROM TABLE');
pFIBQuery1.BatchOutputRawFile('table.fib');
pFIBQuery1.Close;

В доке написано: pFIBQuery1.SQL:= 'SELECT * FROM TABLE';
но компилятор естественно ругается.

Добавлено: 31 июл 2006, 12:27
CyberMax
Товарищ, а кто будет набор открывать после задания запроса?

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

pFIBQuery1.SQL.Add('SELECT * FROM TABLE'); 
pFIBQuery1.Open;
pFIBQuery1.BatchOutputRawFile('table.fib'); 
pFIBQuery1.Close;
Если он был открыт, не забудь закрыть перед этим :).

Добавлено: 31 июл 2006, 12:47
Guard
CyberMax писал(а):Товарищ, а кто будет набор открывать после задания запроса?

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

pFIBQuery1.Open;
[/quote]
Спасибо конечно, но где ты видел для TpFIBQuery метод OPEN ? :lol:

Добавлено: 31 июл 2006, 12:54
CyberMax
А, ну да. Там ExecQuery. Но это неважно. Я тебе дал понять, что надо открыть набор после задания запроса. Мог бы и сам догадаться.

Добавлено: 31 июл 2006, 12:56
Guard
CyberMax писал(а):А, ну да. Там ExecQuery. Но это неважно. Я тебе дал понять, что надо открыть набор после задания запроса. Мог бы и сам догадаться.
Ну догодался конечно, ещё до того как сюда писать. В документации про это кстати ни слова. Но это тоже не помогает :(

Добавлено: 31 июл 2006, 12:57
CyberMax
Хм. Попробую у себя сейчас эту ситуацию смоделировать.

Добавлено: 31 июл 2006, 13:07
Guard
На сайте DEVRACE есть пример: http://devrace.com/ru/fibplus/articles/1436.php

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

procedure TFormBatch.BQueryBatchOutputRawClick(Sender: TObject);
begin
  if OpenDialogOutRaw.Execute then
  begin
    SelectQuery.Close;
    SelectQuery.BatchOutputRawFile(OpenDialogOutRaw.FileName);
    SelectQuery.Close;
  end;
end;
Зачем два Close я так и не понял, но так тоже не работает.

Добавлено: 31 июл 2006, 13:12
CyberMax
Залез в исходники.
1. BatchOutputRawFile самостоятельно вызывается ExecQuery, поэтому и два Close.
2. У меня на FIB+ 6.4.5 такая же ситуация - не выгружает. Косвенная причина - после ExecQuery RecordCount = 1, хотя таблица там тысячи на три записей.

Добавлено: 31 июл 2006, 13:16
Guard
Ещё круче - если GoToFirstRecordOnExecute = False, то вылетает с ошибкой "Can't fetch next record because XXXX dataset closed"

Добавлено: 31 июл 2006, 13:29
CyberMax
Отгадка такая: убери qoStartTransaction и qoAutoCommit. Перед запуском транзакция должна быть активной. :)

Добавлено: 31 июл 2006, 13:35
Guard
Алелуйя, славься великий CyberMax - спаситель мелких никчемных зверюшек типа меня :lol: