опубликован 16-02-2002 09:41 MSK
Господа, помогите!
Необходимо в поле типа text (MSSQL2000)записать файл, и соответсвенно потом его оттуда прочитать. :)
Записать вроде получается, а прочитать нет.:)Для записи в БД делаю примерно следущее:
VARIANT varArray
char *pBuf = NULL;
ifstream fi("c:\\in.ext", ios::in | ios::binary);
long 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;
m_RS->Fields->GetItem("TextData")->AppendChunk(varArray);
VariantClear(&varArray);
}
Записывает...
Потом пытаюсь сделать наоборот,- сохранить данные из поля в файл:
_variant_t varBLOB;
long lDataLength = 0;
char *pBuf = NULL;
lDataLength = m_RS->Fields->GetItem("TextData")->ActualSize;
if(lDataLength > 0)
{
VariantInit(&varBLOB);
varBLOB = m_RS->Fields->GetItem("TextData")->GetChunk(lDataLength);
if(varBLOB.vt == (VT_ARRAY | VT_UI1))
{
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
ofstream fo("c:\\out.ext", ios::out | ios::binary);
fo.write(pBuf,lDataLength);
fo.close();
SafeArrayUnaccessData(varBLOB.parray);
}
}
При чтении из БД lDataLength содержит размер, сохранненого файла,-
как и должно быть. При этом проверка условия (varBLOB.vt == (VT_ARRAY | VT_UI1)) даёт
false т.к. varBLOB.vt==VT_BSTR??? Почему varBLOB при чтении из БД воспринимает данные как строку, а не как SafeArray? Ведь перед записью я присвоил varArray.vt=(VT_ARRAY | VT_UI1), то при и чтении из БД я должен получить varBLOB.vt тоже равным (VT_ARRAY | VT_UI1)? Ну и конечно, при попытке прочитать данные из VarBLOB.parray прога вылетает по access violation.
В чём может быть дело?