[ The Ja @ 02.12.2004. 14:23 ] @
Treba da u Access bazu unesem mnoooogo podataka u jednu tabelu, koja je indeksirana po dva txt polja (Oko 200 txtfajova u CSV formatu, svako oko 2Mb, sa po 15000 zapisa).
To trenutno radim preko ExecuteNonQuery, ali mi je to mnogo sporo (oko 40s po fajlu).

Da li postoji neki drugi način, npr. da napravim DataSet u memoriji, pa da ga na kraju Update-ujem, ili slično.

Napominjem da podatke neću puniti odjednom, već više puta, pa me interesuje da li mogu da napravim prazan DataSet (napominjem da do sad nisam baš puno radio s DataSet-ovima u C#-u)

Hvala.
[ spartak @ 03.12.2004. 07:45 ] @
Ako sam dobro razumeo ti neces raditi neko kreiranje i inicijalizaciju nove baze sa tim podacima ili neku migraciju, vec ces cesto prepumpavati toliko zapisa tamo-ovamo?

Mozemo li da znamo zasto to raidis, koja je svrha toga pa da ti mozda preporucimo nesto brze i efikasnije.
[ The Ja @ 03.12.2004. 10:42 ] @
Citat:
spartak: Ako sam dobro razumeo ti neces raditi neko kreiranje i inicijalizaciju nove baze sa tim podacima ili neku migraciju, vec ces cesto prepumpavati toliko zapisa tamo-ovamo?

Dobro si razumeo, tj. neću ih prepumpavati tamo-ovamo, već samo tamo.
Citat:
spartak: Mozemo li da znamo zasto to raidis, koja je svrha toga pa da ti mozda preporucimo nesto brze i efikasnije.

Radim u Telekomu RS na AXE centrali, pa pravim neku aplikaciju za kontrolu listinga.
(Na žalost radim je besplatno, tj. da sebi olakšam neke druge poslove.)
Na centrali se bilježe svi pozivi, i dnevno se kreira oko 10 txt fajlova, koje prebacujem u bazu, i kasnije ih koristim iz drugog programa.

U principu SQL server bi mi možda ubrzao posao, ali mi opcija s Access-om trenutno radi posao, ali konvertovanje dugo traje.
S DaoRecordSet-om u VC++ to radi 3-4 puta brže, ali polako učim C#, pa bih želio da to uradim u njemu.
[ mmix @ 03.12.2004. 15:16 ] @
Ne moras da koristis SQL bazu, dovoljno da imas SQL instaliran. Onda iz njega napravis DTS paket koji ce ti source text file importovati u Access bazu. Za sve ovo ti ne treba linija koda. To je sto se tice najlakse i verovatno najbrze opcije.

Medjutim, ako bas hoces da se igras sa C#-om, odgovor lezi u DataAdapteru. Mozes da koristis OdbcDataAdapter koji ide preko ODBCa, ili (preporucujem) preko OldDbDataAdapter-a, koji je brzi i napredniji (posto je OleDB bolji od ODBCa). A pre svega, potreban ti je DataSet koji ces puniti podacima iz koda.

Najlaksi nacin da napravis sve sto ti treba je da kao prvo napravis konekciju sa Access bazom u "Server Explorer" toolboxu koristeci Jet OLEDB provider
Dalje, iz Server explorera prebaci tabelu na Form, to ce ti na formi krerati konekciju i OleDbDataAdapter sa svim odgovarajucim komandama (select/insert/update/delete).
Desno dugme misa na DataAdapter na formi i izaberi "Generate dataset"; iz wizarda izaberi New, daj mu neko ime, iz liste tabela izaberi svoju (verovatno ce biti samo jedna ako nemas druge adaptere na formi) i cekiraj "Add this dataset to the designer". To ce ti u projekat dodati .xsd fajl sa semom koja odgovara semi tabele u bazi, a na formu dodati instancu tog dataseta

U kodu forme jednostavno punis dataset do mile volje i kad zavrsis sa svim unosima i hoces da prebacis dataset u bazu, samo pozovi Update metod DataAdaptera i kao parametar prosledi instancu DataSet-a.


[ spartak @ 03.12.2004. 15:24 ] @
Evo kako ja za sada razumem ono sto ti radis:

txt CSV -1-> Access -2-> sad koristis te podatke drugom aplikacijom

Dopunsko pitanje za korak 1 glasi: "Da li odradjujes bilo kakvu poslovnu logiku pri punjenju Access baze, to jest da li transformises u prvom koraku podatke na bilo koji nacin?"

U slucaju da je odgovor ne, licno ne vidim razlog da prepumpavas podatke .NET aplikacijom. Zasto direktno ne importujes file u Access sa GetExternalData?
[ The Ja @ 03.12.2004. 15:46 ] @
Citat:
spartak: Evo kako ja za sada razumem ono sto ti radis:

txt CSV -1-> Access -2-> sad koristis te podatke drugom aplikacijom

Dopunsko pitanje za korak 1 glasi: "Da li odradjujes bilo kakvu poslovnu logiku pri punjenju Access baze, to jest da li transformises u prvom koraku podatke na bilo koji nacin?"

U slucaju da je odgovor ne, licno ne vidim razlog da prepumpavas podatke .NET aplikacijom. Zasto direktno ne importujes file u Access sa GetExternalData?


Za sad se to slaže s onim što sam napisao, ali ranije nisam naveo da tekst koji daje centrala nije CSV, već su podaci fiksne dužine, bez separatora, i što je još gore s vremena na vreme se ubacuju neki karakteri koji kvare strukturu zapisa. Tako da sam već napravio program koji od tog txt fajla generiše CSV, i u njega ubacuje neke dodatne informacije kojih nema u originalnom fajlu (naziv mesta koje je pozvano, tarifnu klasu, ...).

CSV sam naveo jer mi nije potreban način na koji ću izvući podatke iz originalnog fajla, već način na koji da ubrzam čitav proces, a u konačnoj verziji se uopšte neće ni pojavljivati, ali sad se CSV kreira za oko 2.5s, a podaci prebacuju u bazu (uz isti kod) za oko 40s (a u VC++ za oko 5s - u praznu bazu, uz MFC kod).

GetExternalData mi ne radi posao, jer je fajlove potrebno obrađivati bar jednom dnevno, što često neću raditi ja već neko od tehničara, a za to je mnogo lakše i elegantnije rešenje da kliknu na digme, i izaberu mesec i godinu na koje se odnose podaci.

Citat:
mmix: Ne moras da koristis SQL bazu, dovoljno da imas SQL instaliran. Onda iz njega napravis DTS paket koji ce ti source text file importovati u Access bazu. Za sve ovo ti ne treba linija koda. To je sto se tice najlakse i verovatno najbrze opcije. :)

Medjutim, ako bas hoces da se igras sa C#-om, odgovor lezi u DataAdapteru. Mozes da koristis OdbcDataAdapter koji ide preko ODBCa, ili (preporucujem) preko OldDbDataAdapter-a, koji je brzi i napredniji (posto je OleDB bolji od ODBCa). A pre svega, potreban ti je DataSet koji ces puniti podacima iz koda.

Najlaksi nacin da napravis sve sto ti treba je da kao prvo napravis konekciju sa Access bazom u "Server Explorer" toolboxu koristeci Jet OLEDB provider
Dalje, iz Server explorera prebaci tabelu na Form, to ce ti na formi krerati konekciju i OleDbDataAdapter sa svim odgovarajucim komandama (select/insert/update/delete).
Desno dugme misa na DataAdapter na formi i izaberi "Generate dataset"; iz wizarda izaberi New, daj mu neko ime, iz liste tabela izaberi svoju (verovatno ce biti samo jedna ako nemas druge adaptere na formi) i cekiraj "Add this dataset to the designer". To ce ti u projekat dodati .xsd fajl sa semom koja odgovara semi tabele u bazi, a na formu dodati instancu tog dataseta

U kodu forme jednostavno punis dataset do mile volje i kad zavrsis sa svim unosima i hoces da prebacis dataset u bazu, samo pozovi Update metod DataAdaptera i kao parametar prosledi instancu DataSet-a.


Probaću ovo rešenje negde iduće sedmice (kažu da ne valja raditi posao kod kuće), pa ću javiti da li je bilo ubrzanja u procesu, i kolika su.

U svakom slučaju, hvala na trudu.
[ spartak @ 03.12.2004. 18:46 ] @
Citat:
što često neću raditi ja već neko od tehničara, a za to je mnogo lakše i elegantnije rešenje da kliknu na digme, i izaberu mesec i godinu na koje se odnose podaci

Sta je 40 sec za jednog tehnicara? Taman mu dodje fino da klikne na dugme i zapali cigaretu :-)

Organizaciono ti druze nemas problem. E sad ako si perfekcionista idemo dalje od nedelje...