Здравствуйте 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;
Здравствуйте Ростислав Глухов, Вы писали:
РГ>Здравствуйте KAY, Вы писали:
KAY>>А нельзя ли это сделать с помощью CLongBinary или чего-нибудь подобного ???
РГ>А чем этот метод не подходит?
В принципе — все ОК, вот только когда я хочу закрыть рекордсет со вставленными данными, вываливается exception с ошибкой 800a0c93.
Говорит, что нельзя произвести операцию в данном контексте.
В чем может быть проблема?????
Здравствуйте KAY, Вы писали:
KAY>Здравствуйте Ростислав Глухов, Вы писали:
РГ>>Здравствуйте KAY, Вы писали:
KAY>>>А нельзя ли это сделать с помощью CLongBinary или чего-нибудь подобного ???
РГ>>А чем этот метод не подходит?
KAY>В принципе — все ОК, вот только когда я хочу закрыть рекордсет со вставленными данными, вываливается exception с ошибкой 800a0c93. KAY>Говорит, что нельзя произвести операцию в данном контексте. KAY>В чем может быть проблема?????
С последним проблема решилась... Однако осталась еще одна —
не могли ли бы вы прислать кусок кода, который читает из БД
данные (GetChunk) и сохраняет их в файле ??? Очень нужно и
очень срочно !
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);
}