Re: Прога с ADO
От: Аноним  
Дата: 26.08.02 07:54
Оценка:
Ну во первых, ты должен быть уверен, что сервер возвращает тебе бинарник как VARIANT.vt = VT_ARRAY|VT_UI1. C SAFEARRAY все работает нормально, вот пример:

CByteArray* CTableADO::GetByteArrayVal(CString FieldName)
{
CByteArray* ret_val = new CByteArray;
VARIANT _result;
VariantInit(&_result);
try
{
HRESULT _hr = m_pRecordset->Fields->GetItem(COleVariant(FieldName))->get_Value(&_result);
if (FAILED(_hr)) throw _com_error(_hr);
}
catch(_com_error& e) { Process_com_error(e); }
if(_result.vt == ((unsigned short) VT_ARRAY|VT_UI1) && _result.parray != NULL)
{
SAFEARRAY* psa = _result.parray;
BYTE HUGEP *pv;
HRESULT hr = SafeArrayAccessData(psa, (void HUGEP**)&pv);
if(!FAILED(hr))
{
if(psa->cbElements == 1)
{
int Size = psa->rgsabound[0].cElements;
ret_val->SetSize(Size);
memcpy(ret_val->GetData(),pv,Size);
}
SafeArrayUnaccessData(psa);
SafeArrayDestroy(psa);
}
}
return ret_val;
}
// С установкой значения еще проще

bool CTableADO::SetByteArrayVal(CString FieldName,CByteArray& Val)
{
return SetVariantVal(FieldName,COleVariant(Val));
}

bool CTableADO::SetVariantVal(CString FieldName,const COleVariant& Val)
{
bool ret_val = false;
try { m_pRecordset->Fields->GetItem(COleVariant(FieldName))->Value = Val; ret_val = true; }
catch(_com_error e) { AfxMessageBox(e.ErrorMessage()); }
return ret_val;
}

А вот на мой вопрос чего-то никто ничего не отвечает...
:(
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.