WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  AppendChunk() и GetChunk()

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   AppendChunk() и GetChunk()
spectator опубликован 16-02-2002 09:41 MSK   Click Here to See the Profile for spectator   Click Here to Email spectator  
Господа, помогите!
Необходимо в поле типа 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.
В чём может быть дело?

necer опубликован 18-02-2002 10:29 MSK     Click Here to See the Profile for necer  Click Here to Email necer     
Не знаю, как в SQL2000, а в SQL6.5 поле text и должно возвращаться строкой. Вот если image - тогда safearray получается железно.

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.