IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.
Модератор: kdv
-
sunduk4
- Сообщения: 18
- Зарегистрирован: 02 май 2006, 13:45
Сообщение
sunduk4 » 02 май 2006, 14:32
Пытаюсь прочитать данные из файла в blob -
Код: Выделить всё
if (isc_dsql_allocate_statement(status, &DB, &blb_stmt))
{
ERREXIT(status, 1)
}
char blb_select[1000] = "update table set blobfield = ? where id = 1";
blb_sqlda = (XSQLDA *) malloc(XSQLDA_LENGTH (1));
blb_sqlda->sqln = 1;
blb_sqlda->sqld = 1;
blb_sqlda->version = 1;
blb_sqlda->sqlvar[0].sqldata = (char *) &blob_id;
blb_sqlda->sqlvar[0].sqltype = SQL_BLOB;
blb_sqlda->sqlvar[0].sqllen = sizeof(ISC_QUAD);
isc_create_blob2(status,
&DB,
&trans,
&blob_handle,
&blob_id,
0,
NULL
);
left_count = lposition - fposition;
while (left_count > 0)
{
if (left_count < 16384)
{
read_count = left_count;
left_count = 0;
}
else
{
read_count = 16384;
left_count = left_count - 16384;
}
fread(blob_segment, sizeof(char), read_count, bstream);
isc_put_segment(status,
&blob_handle,
read_count,
blob_segment
);
if (status[0] == 1 &&status[1])
{
ERREXIT(status, 1);
}
};
if (isc_dsql_execute_immediate(status, &DB, &trans, 0, blb_select, 1, blb_sqlda))
{
ERREXIT(status, 1)
}
isc_close_blob(status,&blob_handle);
Ошибки нет, данные из файла читаются, а в блобе - пусто. Подскажите, пожалуйста, что не так?
-
sunduk4
- Сообщения: 18
- Зарегистрирован: 02 май 2006, 13:45
Сообщение
sunduk4 » 02 май 2006, 15:21
Сделал так -
Код: Выделить всё
isc_close_blob(status,&blob_handle);
if (isc_dsql_execute_immediate(status, &DB, &trans, 0, blb_select, 1, blb_sqlda))
{
ERREXIT(status, 1)
}
с блобом, в котором содержится текст - все ок. А если в блобе изображение - получаю пустоту. Получается нужно разделять содержимое?
-
sunduk4
- Сообщения: 18
- Зарегистрирован: 02 май 2006, 13:45
Сообщение
sunduk4 » 03 май 2006, 09:43
Пишу блоб из базы в файл вот таким образом -
Код: Выделить всё
FILE *bstream;
blob_id = *(ISC_QUAD *) (chn_sqlda->sqlvar[chn_i].sqldata);
fposition = ftell(bstream);
isc_open_blob2(
status,
&DB,
&trans,
&blob_handle,
&blob_id,
0,
NULL
);
blob_stat = isc_get_segment(
status,
&blob_handle,
&actual_seg_len,
sizeof(blob_segment),
blob_segment
);
while (blob_stat == 0 ||status[1] == isc_segment)
{
blob_stat =isc_get_segment(status,
&blob_handle,
&actual_seg_len,
sizeof(blob_segment),
blob_segment
);
fwrite(blob_segment, strlen(blob_segment), 1, bstream);
};
isc_close_blob(status,&blob_handle);
в один файл льется все, и текст и изображения, наружу выдаются первая и последняя позиции в файле, куда записались данные из блоба. по ним потом соответственно идет чтение.
-
Dimitry Sibiryakov
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Сообщение
Dimitry Sibiryakov » 03 май 2006, 13:21
strlen(blob_segment)?????
Ну и кто ты после этого? Нормальные люди использовали бы actual_seg_len, причем начинали запись в файл не со второго сегмента а с первого.
-
sunduk4
- Сообщения: 18
- Зарегистрирован: 02 май 2006, 13:45
Сообщение
sunduk4 » 03 май 2006, 14:14
Это в принципе моя первая программа на C, поэтому попрошу сильно больно не пинать..
Запись в файл исправил -
Код: Выделить всё
blob_id = *(ISC_QUAD *) (chn_sqlda->sqlvar[chn_i].sqldata);
fposition = ftell(bstream);
isc_open_blob2(
status,
&DB,
&trans,
&blob_handle,
&blob_id,
0,
NULL
);
blob_stat = isc_get_segment(
status,
&blob_handle,
&actual_seg_len,
sizeof(blob_segment),
blob_segment
);
fwrite(blob_segment, actual_seg_len, 1, bstream);
while (blob_stat == 0 ||status[1] == isc_segment)
{
blob_stat =isc_get_segment(status,
&blob_handle,
&actual_seg_len,
sizeof(blob_segment),
blob_segment
);
fwrite(blob_segment, actual_seg_len, 1, bstream);
};
похоже я еще при чтении с fread перемудрил.. в файле виден заголовок блоба, тип содержимого, а при чтении все равно получаю пустоту..