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

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
Guard
Сообщения: 11
Зарегистрирован: 31 июл 2006, 12:00

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

Сообщение Guard » 31 июл 2006, 12:11

Проблемы с 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';
но компилятор естественно ругается.

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 31 июл 2006, 12:27

Товарищ, а кто будет набор открывать после задания запроса?

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

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

Guard
Сообщения: 11
Зарегистрирован: 31 июл 2006, 12:00

Сообщение Guard » 31 июл 2006, 12:47

CyberMax писал(а):Товарищ, а кто будет набор открывать после задания запроса?

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

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

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 31 июл 2006, 12:54

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

Guard
Сообщения: 11
Зарегистрирован: 31 июл 2006, 12:00

Сообщение Guard » 31 июл 2006, 12:56

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

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 31 июл 2006, 12:57

Хм. Попробую у себя сейчас эту ситуацию смоделировать.

Guard
Сообщения: 11
Зарегистрирован: 31 июл 2006, 12:00

Сообщение Guard » 31 июл 2006, 13:07

На сайте 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 я так и не понял, но так тоже не работает.

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 31 июл 2006, 13:12

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

Guard
Сообщения: 11
Зарегистрирован: 31 июл 2006, 12:00

Сообщение Guard » 31 июл 2006, 13:16

Ещё круче - если GoToFirstRecordOnExecute = False, то вылетает с ошибкой "Can't fetch next record because XXXX dataset closed"

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 31 июл 2006, 13:29

Отгадка такая: убери qoStartTransaction и qoAutoCommit. Перед запуском транзакция должна быть активной. :)

Guard
Сообщения: 11
Зарегистрирован: 31 июл 2006, 12:00

Сообщение Guard » 31 июл 2006, 13:35

Алелуйя, славься великий CyberMax - спаситель мелких никчемных зверюшек типа меня :lol:

Ответить