C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
TBlobStream??????????????
ZDV
Отправлено: 11.01.2006, 01:23


Ученик-кочегар

Группа: Участник
Сообщений: 19



Ситуация следующая: есть RichEdit, Table с полем типа Blob, Query.
Нужно записывать в поле типа Blob текст из RichEdit по нажатию Button1 и выгружать из таблицы в RichEdit по нажатию Button2

Делаю Так:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
TStream *pStream;
DataSource1->DataSet->Edit();

if (DataSource1->DataSet->State == dsEdit){
pStream = DataSource1->DataSet->CreateBlobStream(DataSource1->DataSet->FieldByName("Note"), bmReadWrite);
try{
pStream->Seek(0, 2);
pStream->Write(RichEdit1->Text.c_str(), RichEdit1->Text.Length());

DataSource1->DataSet->Post();
}
__finally{
delete pStream;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
int MemSize;
Query1->Close();
Query1->SQL->Clear();
char sql[255];
sprintf(sql, "select Note from 'BZ/BZ.db' where ID = 1");
Query1->SQL->Add(sql);
Query1->Open();

char *Buffer;
TBlobStream *Stream;

Query1->First();

Stream = new TBlobStream((TBlobField *)Query1->FieldByName("Note"), bmRead);

try{
MemSize = Stream->Size + 1;
Buffer = new char[MemSize];
try{
Stream->Read(Buffer, MemSize);
RichEdit1->SetTextBuf(Buffer);
}
catch (...){
delete Buffer;
throw;
}
delete Buffer;
}
catch (...){
delete Stream;
throw;
}
delete Stream;
}

Но никакого эффекта ни в ту ни в другую сторону sad.gif

Где я не прав????????????????
GoodWin
Отправлено: 11.01.2006, 10:20


Дежурный стрелочник

Группа: Участник
Сообщений: 50



У меня была точно такая же проблема(записывал файл в ячейку). Точно не помню, но по первому впечатлению ошибка может быть в следующем:

Если не вызвать delete pStream, то запись по в таблицу не производится(т.е. запись производится по деструктору), поэтому когда ты вызываешь DataSource1->DataSet->Post(), то запись еще не произведена. Попробуй поменять местами к такому виду:

delete pStream;
DataSet->Post();

Если не поможет, то напиши, я гляну у себя в старых кодах, сейчас на работе просто сижу biggrin.gif .
ZDV
  Отправлено: 11.01.2006, 11:57


Ученик-кочегар

Группа: Участник
Сообщений: 19



Попробовал. Стало записывать в таблицу, Но не обновляя ячейку, а дополняя к уже имеющимся данным. А вот считывать из таблицы по прежнему отказывается. Пишет Stream->Size = 0; sad.gif
GoodWin
Отправлено: 11.01.2006, 12:09


Дежурный стрелочник

Группа: Участник
Сообщений: 50



Для того чятобы обновлял, а не дописывал скорее всего надо изменить
pStream = DataSource1->DataSet->CreateBlobStream(DataSource1->DataSet->FieldByName("Note"), bmReadWrite);
на
pStream = DataSource1->DataSet->CreateBlobStream(DataSource1->DataSet->FieldByName("Note"), bmWrite);
если не поможет, попробуй очистить поток, а потом записывать.
Насчет чтения:
Я создавал поток с помощью этого же метода CreateBlobStream и у меня вроде все было в порядке, хотя может и есть какие отличия(вечером гляну, напишу)

ZDV
Отправлено: 11.01.2006, 13:07


Ученик-кочегар

Группа: Участник
Сообщений: 19



Большое спасибо. Заработало biggrin.gif (в смысле записывает обновляя, а не дополняя)

А вот с чтением какаято беда непонятная. Если что найдешь — пиши
ZDV
Отправлено: 11.01.2006, 16:42


Ученик-кочегар

Группа: Участник
Сообщений: 19



Поменял тип поля с Formatted Memo на Memo И все заработало biggrin.gif

Только одного не могу понять — Чем они так принципиально отличаются?

Вернуться в Работа с базами данных в C++Builder