xmlChild = xmlParent->AddChild("bases:enterpriseMap");
TBlobField *bf = dynamic_cast<TBlobField *>(xmlDataSet->FieldByName("FILE_CONTENT"));
TMemoryStream *stream = new TMemoryStream;
bf->SaveToStream(stream);
xmlChild->SetNodeValue( stream );
delete stream;
Сохранение содержимого BLOB-поля в XML
Собственно сабж. Есть база FireBird, в одной из таблиц которой содержится блоб поле. Не подскажет ли кто-то как грамотно перенести его содержимое в ХМЛ.
Пробовал такой вот код:
Код:
Но вместо ожидаемого блоба туда заносится просто значение true...
Как быть?
Логично. Blob поле - двоичные данные. Конверть их в Hex или Mime с заменой спец символов и тогда уже сохраняй.
А нельзя ли поконкретней как это организовать?
Код:
char buffer[255];
int a = 0xdeadbeef;
int b = 0x0badc0de;
wsprintf(buffer,"0x%x 0x%x",a,b);
MessageBox(0,buffer,0,MB_OK);
int buffer2[2] = {0xdeadbeef,0x0badc0de};
char buffer3[255];
TMemoryStream *strm1 = new TMemoryStream;
TMemoryStream *strm2 = new TMemoryStream;
strm1->WriteBuffer(buffer2,sizeof(buffer2));
NMUUProcessor1->InputStream = strm1;
NMUUProcessor1->OutputStream = strm2;
NMUUProcessor1->Encode();
strm2->ReadBuffer(buffer3,(int)strm2->Size);
ShowMessage(AnsiString(buffer3));
int a = 0xdeadbeef;
int b = 0x0badc0de;
wsprintf(buffer,"0x%x 0x%x",a,b);
MessageBox(0,buffer,0,MB_OK);
int buffer2[2] = {0xdeadbeef,0x0badc0de};
char buffer3[255];
TMemoryStream *strm1 = new TMemoryStream;
TMemoryStream *strm2 = new TMemoryStream;
strm1->WriteBuffer(buffer2,sizeof(buffer2));
NMUUProcessor1->InputStream = strm1;
NMUUProcessor1->OutputStream = strm2;
NMUUProcessor1->Encode();
strm2->ReadBuffer(buffer3,(int)strm2->Size);
ShowMessage(AnsiString(buffer3));
Немного изменил код в перерасчете на XML.
Если кому-то понадобится, вот пример того, что вышло.
Код:
xmlChild = xmlParent->AddChild("bases:someXMLfield");
TBlobField *bf = dynamic_cast<TBlobField *>(xmlDataSet->FieldByName("FILE_CONTENT"));
TMemoryStream *in_stream = new TMemoryStream;
TMemoryStream *out_stream = new TMemoryStream;
bf->SaveToStream(in_stream);
TNMUUProcessor *coder = new TNMUUProcessor(NULL);
coder->InputStream = in_stream; //входящий поток, содержит первозданную информацию блоба
coder->OutputStream = out_stream; //исходящий поток, принимает кодированое содержимое блоба
coder->Encode(); //собственно само кодирование
TStringList *pSL = new TStringList;
pSL->LoadFromStream( out_stream ); //загрузка текста из потока
xmlChild->SetText( pSL->Text );
TBlobField *bf = dynamic_cast<TBlobField *>(xmlDataSet->FieldByName("FILE_CONTENT"));
TMemoryStream *in_stream = new TMemoryStream;
TMemoryStream *out_stream = new TMemoryStream;
bf->SaveToStream(in_stream);
TNMUUProcessor *coder = new TNMUUProcessor(NULL);
coder->InputStream = in_stream; //входящий поток, содержит первозданную информацию блоба
coder->OutputStream = out_stream; //исходящий поток, принимает кодированое содержимое блоба
coder->Encode(); //собственно само кодирование
TStringList *pSL = new TStringList;
pSL->LoadFromStream( out_stream ); //загрузка текста из потока
xmlChild->SetText( pSL->Text );
Еще TBlobStream глянь, может удасться сократить код.