ODBC & CRecordset

8 отговора 122 прегледа
#1

ODBC & CRecordset

Ползвам си стандартна access-ка бд.
Може ли рекордсета в ODBC да се отвори като TableType? И как да стане?
Тук виждам само:
CRecordset::dynaset
CRecordset::snapshot
CRecordset::dynamic
CRecordset::forwardOnly


Отговор
в отговор на МиГ-31 #2

Отг: ODBC & CRecordset

CDaoRecordset stawa li?
ima dbOpenTable....

Отговор
в отговор на emo #3

цъ:(

Изискването е да се избегне ДАО-то и достъпа до Jet-a да става през ODBC:(

Отговор
в отговор на МиГ-31 #4

Отг: ODBC & CRecordset

don't think about it

Отговор
в отговор на МиГ-31 #5

мии...

доколкото се сещам, единственото нещо, за което ти трябва table type recordset, e seek. ама разни среди (повечето) нямат seek, така че защо въобще ти е table type? предполагам, че използването на ODBC предполага използване на друг вид база в бъдеще, така че...

Отговор
в отговор на МиГ-31 #6

Отг: ODBC & CRecordset

не. ODBC не поддържа opentable recordset. Реордсет от типа Opentable е валиден само и само за Jet. Seek е мотод който също е валиден само за Jeta. Пусни seek с ODBC и гледай как пищи всичко.

Отговор
в отговор на МиГ-31 #7

MFC must DIE !!!

Или поне класовете, които капсулират ODBC функциите. Ровейки се и трасирайки тез класове открих фрапиращи неща. MS много ми падна в очите за съжаление.
Например стандартната и може би най-често използвана функция GetFieldValue кой знае защо винаги (освен всичко останало) връща резултата в CString екземпляр, който съответно всеки път си заделя нов буфер, след като е освободил стария.
Представете си, какъв колосален спад на производителност ще имате, ако използвате въпросната функция за да анализирате извадка от примерно няколко стотин хиляди записа.
Сега съм решил да ползвам суровото ODBC API. Ако не ме домързи, може да направя сравнителни тестове между CRecordset::GetFieldValue и съответната api func SQLGetData.

Отговор
в отговор на МиГ-31 #8

Отг: MFC must DIE !!!

Ti kato teglish hiljadi zapisi wseki pyt li si inicializirash data promenliwata?

while ( -- not eof -- )
{
LPTSTR pszData = new TCHAR[ MAX ];

pszData = SQLGetData( ... );

-- move next --
}

-- taka li ?

na bas che towa e dostatychno byrzo:

CString strData( '!', MAX );

while ( -- not eof -- )
{
strData = SQLGetData( ... );

-- move next --
}


Отговор
в отговор на jaw #9

Там е работата

За анализ и сметки не се налага всеки път да се заделя буфер. Всъщност, даже не се сещам случай, в който трябва за всеки запис да се заделя памет - прекалено глупаво е.

Отговор