VC++ Recorset(ODBC)...
5 отговора
132 прегледа
VC++ Recorset(ODBC)...
Интерисува ме, как се реализира функция подобна на командата seek в Clipper с фунциите на CRecordset(ODBC) .CRecordset::m_strFilter отделя записите по даден ключ, но ми е необходим и поредния номер на филтрираните записи в цялия Recordset. 
Re: VC++ Recorset(ODBC)...
За DAO има фунция CDaoRecordset::Seek. Такава функция ми трябва и за CRecordset, но не намирам нищо подобно в MSDN . Имащите по-голям опит не може да не са се сблъсквали с този проблем. Въпросът ми към тях е как са го решили: сами ли са си писали 'seek' функция или са ползвали готов сорс и от къде може да се намери? Или има други решения?
Re: VC++ Recorset(ODBC)...
Metodi kato Seek sa realizirani samo za desktop RDBMS - pri client/server ili n-tier sistemite, za koito osnovno e prednaznacheno ODBC-to, takava funkcionalnost bi bila osobeno neefektivna ot gledna tochka na izpolzvaneto na resursite na servera. Izobshto si prerazgledai designa - trqbva da si postroish prilozhenieto taka, che da polzva po vazmozhnost samo forward-only recordseti, a update i delete da pravish samo sas otdelen prepared SQL i/ili stored proceduri, ako smqtash da si puskash uspeshno prilozhenieto na neshto po-golqmo ot clipper.
Dai poveche podrobnosti za tova, koeto iskash da pravish.
Dai poveche podrobnosti za tova, koeto iskash da pravish.
Re: VC++ Recodrset(ODBC)...
Правя модификация на програма. Част от операциите които се правят с базата данни (БД) са следните:
Извършва се постоянно последователно обхождане на всички записи в БД по
ключ- примерно N1 и N2 .Прави се анализ на данните в отделните записи и ако те отговарят на определени критерии, час и др. се изпълняват определени функции. В същото време може произволен запис да бъде избран за редактирене, изтрит или да се добави нов. Позволено е дублиране на ключ. Максималната повторяемост на всяка ключова сойност за момента е 100. Т.е. ако N1 има стойности от 1 до 1000 се получава база от 100000 реда (за сега!).
За да избера определен запис в момента използвам:
m_pSet->Close();
m_strFilter =nFilter;
m_pSet->Open();
зареждам данните в променливи за редактиране и отново за да разреша обхождането:
m_pSet->Close();
m_strFilter ="";
m_pSet->Open();
и т.н. много, много тромаво.
Мисля, че със SEEK ще стане много по-ефективно.
Ако не намеря друго решение или сорс на seek програма се каня да я пиша
по алгоритъма : ключа в коя половина е; в коя четвърт; осма и т.н.
В момента това са ми идеите.

Извършва се постоянно последователно обхождане на всички записи в БД по
ключ- примерно N1 и N2 .Прави се анализ на данните в отделните записи и ако те отговарят на определени критерии, час и др. се изпълняват определени функции. В същото време може произволен запис да бъде избран за редактирене, изтрит или да се добави нов. Позволено е дублиране на ключ. Максималната повторяемост на всяка ключова сойност за момента е 100. Т.е. ако N1 има стойности от 1 до 1000 се получава база от 100000 реда (за сега!).
За да избера определен запис в момента използвам:
m_pSet->Close();
m_strFilter =nFilter;
m_pSet->Open();
зареждам данните в променливи за редактиране и отново за да разреша обхождането:
m_pSet->Close();
m_strFilter ="";
m_pSet->Open();
и т.н. много, много тромаво.
Мисля, че със SEEK ще стане много по-ефективно.
Ако не намеря друго решение или сорс на seek програма се каня да я пиша
по алгоритъма : ключа в коя половина е; в коя четвърт; осма и т.н.
В момента това са ми идеите.
Re: VC++ Recodrset(ODBC)...
1. Ot kade idva kliucha N1, N2? Ne mozhe li da pozlvash join s druga tablica, za da opbrabotish vsichki zapisi na edin pas, bez da otvarqsh recordseta nanovo?
2. Pomisli dali ne mozhe da vkliuchish proverkata za kriteriite v sql-a vav "where" clausata i sortirane, taka che da obrabotish maksimalen broi zapisi na edin pas.
3. Vmesto edin recordset mozhe da polzvash dva, za da ne otvarqsh s edin i sashti filtar recordseta povtorno.
4. Polzvai parametrichni recordseti. Za redaktirane ili iztrivane na edin ili poveche zapisa navednazh e nai-dobre da polzvash update i delete SQL clausi, obache MFC-to ne pozvolqva da gi parametrizirash, zatova shte trqbva da si dopishesh sam neobhodimata funkcionalnost s ODBC API-to. Drugiqt recordset (za obhozhdaneto) shte bade read-only (toi shte stane takav, ako imash joinove) i forward-only, za da ne se keshira varhu diska ot ODBC cursorite.
5. Otnovo tvardq, che seek ne ti trqbva - toi e izmislen za malki desktop bazi danni.
6. Pishi pak, ako imash vaprosi.
2. Pomisli dali ne mozhe da vkliuchish proverkata za kriteriite v sql-a vav "where" clausata i sortirane, taka che da obrabotish maksimalen broi zapisi na edin pas.
3. Vmesto edin recordset mozhe da polzvash dva, za da ne otvarqsh s edin i sashti filtar recordseta povtorno.
4. Polzvai parametrichni recordseti. Za redaktirane ili iztrivane na edin ili poveche zapisa navednazh e nai-dobre da polzvash update i delete SQL clausi, obache MFC-to ne pozvolqva da gi parametrizirash, zatova shte trqbva da si dopishesh sam neobhodimata funkcionalnost s ODBC API-to. Drugiqt recordset (za obhozhdaneto) shte bade read-only (toi shte stane takav, ako imash joinove) i forward-only, za da ne se keshira varhu diska ot ODBC cursorite.
5. Otnovo tvardq, che seek ne ti trqbva - toi e izmislen za malki desktop bazi danni.
6. Pishi pak, ako imash vaprosi.
Re: VC++ Recordset(ODBC)...
Благодаря ти много за идеите. Лошо е да си сам с MSVC и е хубаво когато има някой да помага. 