Проблем ...

12 отговора 280 прегледа
#1

Проблем ...

Пиша една програмка на MSVC (MFC) за да прехвърля няколко таблици от Access в Oracle. Access'97, Oracle 8i 8.1.6.0. От Access-кия файл чета през ODBC (4.00.4403.02), в Oracle-а пиша през Oracle Objects for OLE. Една от таблиците ми създава проблеми.
CREATE TABLE Т1(DATA VARCHAR2(255), ID NUMBER(10) PRIMARY KEY, FREQUENCY NUMBER(10));
Имам си клас наследник на CRecordset, съдържащ съответните member variable-и, bind-нати съответно с трите колони. db_st ми е обект от този клас, а ot е ODynaset.

ot.Open(odb, "SELECT * FROM T1");
db_st.Open(CRecordset::snapshot, "T1");
TCHAR FindClause[255];
while (!db_st.IsEOF()){

lstrcpy(FindClause, "DATA = '");
lstrcat(FindClause, db_st.m_Data);
lstrcat(FindClause, "'");

ot.FindFirst(FindClause);

if (ot.NoMatch()) {
ot.AddNewRecord();
lstrcpy(FindClause, db_st.m_Data);
ot.SetFieldValue("ID", ++iSimple.T1);
ot.SetFieldValue("DATA", (LPCSTR)FindClause);
ot.SetFieldValue("FREQUENCY", 0);
ot.Update();
// odb.CommitTrans();
}
db_st.MoveNext();
}
ot.Close();
db_st.Close();

Проблемите са два:
1) Първо четенето от Access-a не върви по реда на записите... примерно от 214 запис отива на 290, после си вървят подред, после пак прескача няколко... Това не е голям проблем, защото накрая ги е обходил всичките, но все пак ми е интересно защо става
2) Вторият проблем е много по-сериозен -> findfirst-a работи идеално, if-a сработва, обаче в случая когато трябва да влезе вътре в тялото на if-а, не записва нищо в базата...

Чакам някакви коментари...

Отговор
в отговор на Malcolm #2

Отг: Проблем ...

Първия проблем отпадна... Compact Database... :-)

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

Отг: Проблем ...

za da prehvarlish danni mejdu oracle i ms access ne e li nai-lesno da go napravish kato link-nesh tablitsite na oracle v access i izpalnish niakolko sql zaiavki koito se pishat s niakolko tsakvania s mishkata v access?

Отговор
в отговор на Malcolm #4

Отг: Проблем ...

ами да, послушай съвета на tester...
става бързо и лесно
(хм, все пак, ако имаш няколко таблици внимавай с реда им, имам в пред вид primary i foreign key).
Успех...

Отговор
в отговор на Веселина_anon #5

Отг: Проблем ...

Хора, Access-a и Query-то са БАВНИ. Освен това, идеята беше да се разработи клиентска програмта, която оператор-идиот да може да ползва... Каквато и стана... проблема btw го реших, ако някой се интересува...

Отговор
в отговор на Malcolm #6

Отг: Проблем ...

Що пък да са бавни? е, да зависи колко ти е голяма таблицата, колко рекорда имаш.
абе биват и вършат работа.

Отговор
в отговор на Malcolm #7

ге-ге... БАВНИ били...

като гледам, не се притесняваш да правиш FindFirst. FindFirst се изпълнява малко ПО-БАВНО от времето, за което на ръка, с MoveNext ще стигнеш до мястото на търсения елемент - по-бавно е, щото освен MoveNext, FindFirst прави и сравняването... в общи линии, до 5000 записа е нормално да ползваш FindFirst, а при повече, помисли за нещо друго. Ако проблема ти е в скоростта, направи Join, като гледам, DATA-та ти е уникална за всеки запис, Inner Join ще свърши работа, и ще е далеееч по-бързо от FindFirst. Ако не вярваш, пусни си един trace на ODBC-то, да видиш какви чудеса от храброст ще направи абцеса, като тръгне да тегли данните от Oracle. чак да не повярва човек...
Колкото за сортирането, по-добре си сложи един Order By, в SQL-а няма никаква гаранция за реда на записите, освен Order by - така е на теория, така е и в сериозните сърфъри - Oracle, MS SQL и т.н. а абцеса се прави на мъдър, но не винаги успява.

Отговор
в отговор на Kpoмид #8

Отг: ге-ге... БАВНИ били...

Хм. По принцип, вече казах, че това ще е програмка, която да бъде 'дуракоустойчива', така че варианта за връзка през access отпада - това трябва да го правят усери с минимална грамотност и с едно щракване на мишката... Иначе базата с която работя аз се състои от 64 таблици по около 50 000 записа, докато там където ще се използва най- вероятно някои от таблиците ще бъдат от порядъка на 500 000 записа. Засега програмта прехварля със скорост от 34.75 записа в минута, някой да каже дали е добре... Иначе проблема за реда в access-a беше, че този който е правил базата е трил от нея и т.н., трябваше да и дам само един Compact. Интересно че никой не се обажда по другия ми проблем - тялото на if-а не иска да пише в базата... Аз това вече го оправих, но проблема е толкова ИДИОТСКИ, че не вярвам някой да се сети... :-) Просто ми е интересно дали на някой ще му хрумне от къде извира бензина и къде растат кристалите... :)
Това за MoveNext и FindFirst за ODBC ли се отнася или за OO4O ? Живо ме интересува...
btw, още за скоростта - един колега прави същата програма, на CBuilder 5, като чете от access през ODBC и пише в Oracle Light пак през ODBC... та при него скоростта е 2.77 записа в минута... :) то вярно че light-a e бавен, но идва и допълнително забавяне от ODBC-то...



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

Отг: ге-ге... БАВНИ били...

pls, kaji kade e problema - opitah da go pivtoria na MS SQL 7/Access 97 - mi nemojah, if-a si raboti.

a za skorosta - 34.75 zapisa/min e malko po-bavno otkolkoto ako gi diktuvash po telefona (human/voice modem Pesho/Nesho).
za 2.77 niama da govorim ;-0

Отговор
в отговор на e-de #10

Проблем && Скорост

1. Колкото до скоростта, общото количество данни за всеки запис е от порядъка на 2 MB, което май ще мине доста по- бавно voice... :) Иначе имам някои идеи за оптимизация, ще ги направя и по късно ще си постна новата скорост... :-)

2. Проблемът е в parser-а на ОО4О. Прехвърлям няколко таблици точно по същия начин, но тази, при опит за update на ODynaset-а ми връща OERROR_NOUPDATES (4117) ... понеже в името на таблицата имам думата FROM :-) Иначе никакви проблеми с нея, през други средства си я селектвам и т.н., но през OO4O не може... а, с полета които имат в името FROM проблем няма... Явно някакво малко бъгче, решава че това нататък ми е FROM-клауза ... Репортнах го вече на Oracle... A, да не забравя, въпросния ODynaset вече не става за нищо, не може да се ползва след това за други таблици, скапан си е веднъж за винаги...

3. Да добавя само, по отношение на скоростта, че не правя просто изсипване на данните, имам и ДОСТА противни връзки м/у таблиците... и разни статистически полета... отврат...


Отговор
в отговор на Malcolm #11

Скорост

72 rec/sec :-)
И още може...

* Origin: Мой адрес не дом, не улица, мой адрес 2:35/13.137
Отговор
в отговор на Malcolm #12

Отг: ге-ге... БАВНИ били...

това за FindFirst-а и MoveNext-а се отнася за всеки client-side recordset, т.е., такъв, който данните (всичките) първо се източват до клиентската машина, след което се правят операции върху тях. в общи линии, това са 99% от случаите, ако някой използва server-side recordset-и, да каже къде, защо и с какво усилие го е постигнал - а и с каква цел, специално на Oracle бих си написал нещата на PL SQL, вместо да се тормозя с не (толкова) native-похвати...
аз и преди няколко дни се пробвах да напиша отговор, но дир-а точно се скапа и го затри...

Отговор
в отговор на Malcolm #13

Отг: ге-ге... БАВНИ били...

Спорд мен проблем ти е че не си сложил ot.Requery() :))(Не нося отговорност за казаното;))

Отговор