IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.
Модератор: kdv
-
Guard
- Сообщения: 11
- Зарегистрирован: 31 июл 2006, 12:00
Сообщение
Guard » 31 июл 2006, 12:11
Проблемы с BatchOutputRawFile.
Делаю выгрузку в файл. Выгружаются похоже только заголовки ~14 байт

(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 - спаситель мелких никчемных зверюшек типа меня
