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;
}
Но никакого эффекта ни в ту ни в другую сторону
Где я не прав???????????????? |
|
GoodWin |
Отправлено: 11.01.2006, 10:20 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 50
|
У меня была точно такая же проблема(записывал файл в ячейку). Точно не помню, но по первому впечатлению ошибка может быть в следующем:
Если не вызвать delete pStream, то запись по в таблицу не производится(т.е. запись производится по деструктору), поэтому когда ты вызываешь DataSource1->DataSet->Post(), то запись еще не произведена. Попробуй поменять местами к такому виду:
delete pStream;
DataSet->Post();
Если не поможет, то напиши, я гляну у себя в старых кодах, сейчас на работе просто сижу . |
|
ZDV |
Отправлено: 11.01.2006, 11:57 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 19
|
Попробовал. Стало записывать в таблицу, Но не обновляя ячейку, а дополняя к уже имеющимся данным. А вот считывать из таблицы по прежнему отказывается. Пишет Stream->Size = 0; |
|
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
|
Большое спасибо. Заработало (в смысле записывает обновляя, а не дополняя)
А вот с чтением какаято беда непонятная. Если что найдешь — пиши |
|
ZDV |
Отправлено: 11.01.2006, 16:42 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 19
|
Поменял тип поля с Formatted Memo на Memo И все заработало
Только одного не могу понять — Чем они так принципиально отличаются? |
|