Прога с ADO
От: Дукальский В.В.  
Дата: 26.08.02 07:36
Оценка:
Какие компоненты нужно установить, чтобы программа с ADO и БД ACESSS работала на любом компьютере?

И еще — нужно сделать функцию которая возвращает результат запроса в виде массива (VC++). Пробовал сделать с COleSafeArray — не получалось. Может у кого-нибудь есть пример такой функции?

Заранее благодарен.
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;
}

А вот на мой вопрос чего-то никто ничего не отвечает...
:(
Re[2]: Прога с ADO
От: Finder  
Дата: 26.08.02 08:04
Оценка:
Собственно, это был я (забыл при ответе зарегистрироваться)
Re[2]: Прога с ADO
От: glorius  
Дата: 26.08.02 09:38
Оценка:
HRESULT _hr =  m_pRecordset->Fields->GetItem(COleVariant(FieldName))->get_Value(&_result);



Я не очень хорошо знаком с объектами ADO, не могу понять — в какой таблице мы ищем поля. Вообще то желательно получать на входе функции SQL-запрос, а возвращать в виде ассоциированного массива, где ключ — имя поля.
Re: Прога с ADO
От: kig Россия  
Дата: 26.08.02 11:41
Оценка:
Здравствуйте Дукальский В.В., Вы писали:

ДВ>Какие компоненты нужно установить, чтобы программа с ADO и БД ACESSS работала на любом компьютере?


ДВ>И еще — нужно сделать функцию которая возвращает результат запроса в виде массива (VC++). Пробовал сделать с COleSafeArray — не получалось. Может у кого-нибудь есть пример такой функции?


ДВ>Заранее благодарен.


ADO 2.7 API Reference

GetRows Method
Retrieves multiple records of a Recordset object into an array.

Syntax
array = recordset.GetRows( Rows, Start, Fields )
Return Value
Returns a Variant whose value is a two-dimensional array.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.