BLOB-поля
От: KAY  
Дата: 30.11.01 09:12
Оценка:
Народ! Подскажите, плиз, как мне добавить файл (например,
документ Word) в BLOB-поле :crash: (желательно с примером кода).
Заранее благодарен!!!
Меньше знаешь — лучше спишь...
Re: BLOB-поля
От: Ростислав Глухов Россия http://www.geocities.com/rg2204/
Дата: 01.12.01 09:47
Оценка: 4 (1)
Здравствуйте KAY, Вы писали:

KAY>Народ! Подскажите, плиз, как мне добавить файл (например,

KAY>документ Word) в BLOB-поле (желательно с примером кода).
KAY>Заранее благодарен!!!

Добавляется/читается с использованием функций ADO Field:
GetChunk()/AppenfChunk()

например (очень грязно)
[vc]
bool CImUtil::ImFieldFromFile(FieldPtr &fld, _bstr_t ifile)
{
VARIANT varArray;
long lDataLength=0;
char *pBuf = NULL;
int nDataLenRetrieved = 0;

try
{
ifstream fi(ifile, ios::in | ios::binary);
lDataLength = filelength(fi.fd());
if(lDataLength > 0)
{

SAFEARRAY FAR* psa;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = lDataLength;

psa = SafeArrayCreate(VT_I1, 1, rgsabound);

if(SafeArrayAccessData(psa,(void **)&pBuf) == NOERROR)
fi.read(pBuf,lDataLength);
SafeArrayUnaccessData(psa);
varArray.vt = VT_ARRAY | VT_UI1;
varArray.parray = psa;

fld->AppendChunk(varArray); /// !!!!!!

VariantClear(&varArray);

}
fi.close();
}
catch(_com_error &e)
{
MessageBox(HWND_DESKTOP,e.ErrorMessage(),"ERROR",MB_OK);
return false;
}
return true;
}
[/vc]
- А Вы что курите?
— Минздрав предупреждает
Re[2]: BLOB-поля
От: KAY  
Дата: 03.12.01 16:16
Оценка:
Здравствуйте Ростислав Глухов, Вы писали:

РГ>Здравствуйте KAY, Вы писали:


KAY>>Народ! Подскажите, плиз, как мне добавить файл (например,

KAY>>документ Word) в BLOB-поле (желательно с примером кода).
KAY>>Заранее благодарен!!!

РГ>Добавляется/читается с использованием функций ADO Field:

РГ>GetChunk()/AppenfChunk()

РГ>например (очень грязно)

РГ>[vc]
РГ>bool CImUtil::ImFieldFromFile(FieldPtr &fld, _bstr_t ifile)
РГ>{
РГ> VARIANT varArray;
РГ> long lDataLength=0;
РГ> char *pBuf = NULL;
РГ> int nDataLenRetrieved = 0;

РГ> try

РГ> {
РГ> ifstream fi(ifile, ios::in | ios::binary);
РГ> lDataLength = filelength(fi.fd());
РГ> if(lDataLength > 0)
РГ> {

РГ> SAFEARRAY FAR* psa;

РГ> SAFEARRAYBOUND rgsabound[1];
РГ> rgsabound[0].lLbound = 0;
РГ> rgsabound[0].cElements = lDataLength;

РГ> psa = SafeArrayCreate(VT_I1, 1, rgsabound);


РГ> if(SafeArrayAccessData(psa,(void **)&pBuf) == NOERROR)

РГ> fi.read(pBuf,lDataLength);
РГ> SafeArrayUnaccessData(psa);
РГ> varArray.vt = VT_ARRAY | VT_UI1;
РГ> varArray.parray = psa;

РГ> fld->AppendChunk(varArray); /// !!!!!!

РГ> VariantClear(&varArray);

РГ> }

РГ> fi.close();
РГ> }
РГ> catch(_com_error &e)
РГ> {
РГ> MessageBox(HWND_DESKTOP,e.ErrorMessage(),"ERROR",MB_OK);
РГ> return false;
РГ> }
РГ> return true;
РГ>}
РГ>[/vc]

А нельзя ли это сделать с помощью CLongBinary или чего-нибудь подобного ???
Меньше знаешь — лучше спишь...
Re[3]: BLOB-поля
От: Ростислав Глухов Россия http://www.geocities.com/rg2204/
Дата: 04.12.01 07:12
Оценка:
Здравствуйте KAY, Вы писали:

KAY>А нельзя ли это сделать с помощью CLongBinary или чего-нибудь подобного ???


А чем этот метод не подходит?
- А Вы что курите?
— Минздрав предупреждает
Re[4]: BLOB-поля
От: KAY  
Дата: 05.12.01 09:19
Оценка:
Здравствуйте Ростислав Глухов, Вы писали:

РГ>Здравствуйте KAY, Вы писали:


KAY>>А нельзя ли это сделать с помощью CLongBinary или чего-нибудь подобного ???


РГ>А чем этот метод не подходит?


В принципе — все ОК, вот только когда я хочу закрыть рекордсет со вставленными данными, вываливается exception с ошибкой 800a0c93.
Говорит, что нельзя произвести операцию в данном контексте.
В чем может быть проблема?????
Меньше знаешь — лучше спишь...
Re[5]: BLOB-поля
От: KAY  
Дата: 06.12.01 15:59
Оценка:
Здравствуйте KAY, Вы писали:

KAY>Здравствуйте Ростислав Глухов, Вы писали:


РГ>>Здравствуйте KAY, Вы писали:


KAY>>>А нельзя ли это сделать с помощью CLongBinary или чего-нибудь подобного ???


РГ>>А чем этот метод не подходит?


KAY>В принципе — все ОК, вот только когда я хочу закрыть рекордсет со вставленными данными, вываливается exception с ошибкой 800a0c93.

KAY>Говорит, что нельзя произвести операцию в данном контексте.
KAY>В чем может быть проблема?????

С последним проблема решилась... Однако осталась еще одна —
не могли ли бы вы прислать кусок кода, который читает из БД
данные (GetChunk) и сохраняет их в файле ??? Очень нужно и
очень срочно !
Меньше знаешь — лучше спишь...
Re[6]: BLOB-поля
От: Ростислав Глухов Россия http://www.geocities.com/rg2204/
Дата: 07.12.01 12:28
Оценка:
Здравствуйте KAY, Вы писали:


KAY>не могли ли бы вы прислать кусок кода, который читает из БД

KAY>данные (GetChunk) и сохраняет их в файле ??? Очень нужно и
KAY>очень срочно !

Пожалуйста, только пересмотрите код, м.б. потребуется вызывать GetChunk() в цикле, если БЛОБ большой...
[vc]
bool CImUtil::ImField2File(FieldPtr &fld, _bstr_t ofile)
{
_variant_t varBLOB;
long lDataLength = 0;
char *pBuf = NULL;
int nDataLenRetrieved = 0;

try
{
// get the actual length of the data
lDataLength = fld->ActualSize;
if(lDataLength > 0)
{
VariantInit(&varBLOB);
// get the chunk of data
varBLOB = fld->GetChunk(lDataLength);

// If the data retrieved is array of bytes then get data from the array and set the
// data value variable of the edit box
if(varBLOB.vt == (VT_ARRAY | VT_UI1))
{
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
ofstream fo(ofile, ios::out | ios::binary);
fo.write(pBuf,lDataLength);
fo.close();
SafeArrayUnaccessData(varBLOB.parray);
}

}
}
catch(_com_error &e)
{
MessageBox(HWND_DESKTOP,e.ErrorMessage(),"ERROR",MB_OK);
return false;
}
return true;
}
[/vc]
- А Вы что курите?
— Минздрав предупреждает
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.