Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с базой из Com через Adodb

585
26 октября 2005 года
honeybeer
297 / / 06.09.2004
Пишу COM-овскую библиотечку для работы с базой. Один из методов интерфейса выглядит так:

Код:
STDMETHODIMP TCKWorkImpl::Get24OIKdata(OIKCategory eCat, int iParam,
                                       DATE dDate, LPSAFEARRAY* pptVArray)
{
*pptVArray = NULL;
long rgIndices = 0;
SAFEARRAYBOUND sab[1];
HRESULT hr;
sab[0].cElements = 24;
sab[0].lLbound = 0;
try
    {
    spAdo->ProcedureName = "Get24hDataByOiId2D;1";
    spAdo->Parameters->Refresh();
    spAdo->Parameters->Items[1]->Value = eCat;
    spAdo->Parameters->Items[2]->Value = iParam;
    spAdo->Parameters->Items[3]->Value = 0;
    spAdo->Parameters->Items[301]->Value = 1;
    spAdo->Parameters->Items[302]->Value = 60;
    spAdo->Parameters->Items[303]->Value = Date().Val-(dDate ? dDate : dDefault);
    spAdo->Parameters->Items[304]->Value = 24;
    spAdo->Parameters->Items[305]->Value = 0;
    spAdo->Open();
    *pptVArray = SafeArrayCreate(VT_VARIANT, 1, sab);
    if(!(*pptVArray ))return E_OUTOFMEMORY;
    while(!spAdo->Eof)
        {
        hr = SafeArrayPutElement(*pptVArray, &rgIndices, &(spAdo->Fields->Fields[1]->AsVariant));
        spAdo->Next();
        rgIndices++;
        }
    spAdo->Close();
    }
catch(Exception &e)
    {
    return Error(e.Message.c_str(), IID_ICKWork);
    }
return S_OK;
}



знающие подскажите, что здесь надо поправить
585
27 октября 2005 года
honeybeer
297 / / 06.09.2004
Что, никто ничего?
294
28 октября 2005 года
Plisteron
982 / / 29.08.2003
Цитата:
Originally posted by honeybeer
Пишу COM-овскую библиотечку для работы с базой. Один из методов интерфейса выглядит так:

[COLOR=darkred]--- skip ---[/COLOR]

знающие подскажите, что здесь надо поправить



Э... А в чём вообще проблема?

585
28 октября 2005 года
honeybeer
297 / / 06.09.2004
Цитата:
Originally posted by Plisteron
Э... А в чём вообще проблема?


Ну просто я с COM технологией практически не работал, вот и подумал, что товарищи более искушенные могли бы чего нибудь присоветовать. В принципе, код рабочий, только выборка происходит ИМХО слишком медленно. Вот код VBA:

Код:
Sub Test()
Dim v As New CKWork
Dim sTime As Long
sTime = GetTickCount()
v.Connect
v.DefaultDate = Date - 1
Range("J2:J25") = Application.Transpose(v.Get24OIKdata(ocCB1, 875, Range("J1").Value2))
Range("K2:K25") = Application.Transpose(v.Get24OIKdata(ocCB1, 875, Range("K1").Value2))
Range("L2:L25") = Application.Transpose(v.Get24OIKdata(ocCB1, 875, Range("L1").Value2))
Range("M2:M25") = Application.Transpose(v.Get24OIKdata(ocCB1, 875, Range("M1").Value2))
Range("N2:N25") = Application.Transpose(v.Get24OIKdata(ocCB1, 875, Range("N1").Value2))
Range("o2:O25") = Application.Transpose(v.Get24OIKdata(ocCB1, 875, Range("O1").Value2))
v.Disconnect
sTime = GetTickCount() - sTime
PopupForm.Show
PopupForm.Label2.Caption = sTime
End Sub

в среднем ~3000мс
294
29 октября 2005 года
Plisteron
982 / / 29.08.2003
Цитата:
Originally posted by honeybeer
Ну просто я с COM технологией практически не работал, вот и подумал, что товарищи более искушенные могли бы чего нибудь присоветовать. В принципе, код рабочий, только выборка происходит ИМХО слишком медленно.


На вопрос с такой обобщённой темой чаще всего можно услышать ответ: "Почитай MSDN".

За какое время выполнится этот код, если все операции с объектами Range заменить на операции переменными типа Long? Инвми словами, действително ли "узким местом" является твой код, а не Exel-овские операции с ячейками таблицы?
Уж извини, мне самому ломы в твоём коде разбираться, тем более, что он приведён не полностью.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог