Fórumok
Üdvözlet mindenkinek !
Adott a következő probléma :
Adott mondjuk egy relatíve nagy, 100.000 rekordot tartalmazó tábla.
Kinek milyen ötlete van arra,- most a sajátomat szándékosan nem említeném,- hogy a táblából mindig csak a szükséges mennyiségű rekordot olvassa be, és ne az egész táblát, amit majd off-line tallózgatok.....
Ötleteket előre is köszönöm.
Megoldás :
DevXPress - XPO.
Hozzászólások
"most a sajátomat szándékosan nem említeném"
még szerencse, ezek után...
Tudod, ezt szeretem itt ezen a KURVA hupon..... (MÉLY tisztelet a kivételnek.......)
Felteszek egy kérdést, válasz semmi, csak leszólni a másikat.
Köszi. Gratulálok...
Nyugi es ne vedd figyelembe. Turelem es jonnek a valaszok is amik teged erdekelhetnek, de ha mar az elso comment-bol vita lesz akor valoszinu, hogy nem, ezert erdemes lenyelni szo nelkul es elmarad a lavina.
gyökerek mindenhol vannak, illetve mi az adatbáziskezelőd?
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
Bocs, ezt nem említettem, Oracle.
A baj nem az adatbáziskezelővel van, hanem megjelenítéskor a DataGridViewval.
ahogy lentebb említették, OracleCommand-hoz kell kötni a gridview-t. a commandnak meg a spéci eskúelt megadni. vagy update-elni is akarsz a gridview-ból?
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
Hát, pl. hogy a táblából mindig csak a szükséges mennyiségű rekordot olvasd be. :)
Ez nem C# probléma, az SQL TOP és környéke lesz a barátod (attól függ, milyen SQL kiszolgálót használsz).
--
geri / otperc.net
Sajnos C# probléma.
Rendben van, hogy top, illetve az adott adatbázis megfelelőjével a megadott számú rekordokat beolvasod, DE a DataGridViewval ezt hogyan kezeled le ?
Nem azt mondom, hogy nem lehet megoldani, csak nehézkes......
A DataGridView nem erre való. Használj ListView-t, VirtualMode-ban, az pont erre van kitalálva.
Ha arra gondolsz, hogy nem az egész táblán akarsz dolgozni egy adott
időpontban, akkor kellene egy másik, ugyanolyan tábla, amibe átmozgatod
a szükséges adatokat, majd vissza.
Persze a kérdés, mire akarod használni: ha módosítani is akarod
akkor kell a másik tábla, ha nem akkor tehetsz rá view-t is(ez pl. írható is néhány db kezelőben).
:o
ez most komoly?
Most, hogy lassan körvonalozódik maga a probléma, már mást is írhattam volna.
a problematol fuggetlenul tablak kozott masolgatni szerintem eleg szerencsetlen dolog.
Az. Vannak esetek, amikor ez kell.
SqlCommanddal a szerveren hajtod végre a lekérdezéseket, nem pedig DataSetet használsz, majd a command eredményét jeleníted meg.
Köszi válaszod, bocs ha egy picit tömör leszek.
DataSet = off-line kezelés. Előre betöltöm az adatokat.
OracleCommand = SqlCommand Oracle megfelelője , O.K. de nekem kell lekezelnem mindent. Én töltögetem be az adatokat, nem tudok databindingot csinálni, datagridview oszlopra rendezést nekem kell megoldani stb. sajnos nehézkes és fapados.
Retro érzésem van, Clipperes idők jutnak eszembe, amikor mindent le kellett programozni az utolsó "szögig", és nem volt semmi segítség ami átvette volna a munka "kuli" részét.........
Hát..mindennek ára van. Vagy klikk-klikk, jé kész az ügyviteli rendszer és akkor ez a helyzet van, amiben most ülsz vagy igazi programot írsz és akkor neked kell mindent lekezelned, de cserébe olyan fullos rendszert írhatsz, ami sikeres is lesz.
Nem mozgok otthonosan C#-ban es nem is biztos, hogy helyesen ertelmeztem a kerdest de itt egy otlet:
Tolts be X kepernyonyi sort elore es a scroll event-re tegy egy preloader-t ami boviti a listat, igy nem kell nagy mennyisegu adatot mozgatni es tarolni egy idoben. A memoriahasznalat erdekeben meg ne feledkezz meg arrol, hogy a uj adatok betoltese utan uritsd az X kerepnyonel regebbi sorokat.
Feltételezve, hogy se TOP, se LIMIT záradékot nem használhatsz, én lekérdezném az egész táblát, de csak a PK mezőre (vagy a legrövidebb UNIQUE-ra), azt tárolnám, majd lapozásnál IN segítségével leválogatnám az éppen szükséges rekordokat.
ez jó ötlet, esetleg Oracle esetén ROWID alapú szűrés.
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
Na, a ROWID-t kifelejtettem, mentségemre szóljon, hogy soha nem használtam Oracle-t. :)
Köszi, én így csináltam :
Oracle 'top':
select akarmi from (select akarmi, rank() over (order by kulcs) as rovidnev from tabla) where rovidnev< a beolvasando rekordok száma
sima lapozót akarsz amúgy?
SELECT * FROM (SELECT * FROM tabla WHERE ROWID < 75) WHERE ROWID >= 50
ez? (50..74-dik sorok) most nincs kéznél orákulum, szal csak betippeltem.
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
Nem. ROWID >= 50: ez nem értelmezhető.
Szerintem ROWNUM-ra gondolhattál, de ott meg a ROWNUM >= 50 soha nem teljesül, szóval üres halmazt ad vissza.
KisKresz
+1.
Azért írtam rank()-et felhasználva, mert abban már a rendezés is benne van.
rank() helyett nem row_number() kellene?
KisKresz
de igen, mert a subquery 75-ig adja vissza.
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
Teljes select:
select mezonev from(select sorszam,rank() over (order by rendezettseg) as rank_sorszam from tabla) where rank_sorszam between alsolimit and felsolimit
Maximum, ha a ROWNUM-ot a subqueryben visszaadod egy normál oszlopként.
Szerk.: Úgy valóban működik.
KisKresz
Lehet, hogy rosszul értelmezlek...
Amit leírtam példa, az működik, a programomban ez olvassa be a lapozáshoz a szükséges rekordokat....
De a probléma nem az SQL oldalon van.
nekem írta, de ha működik nálad, akkor az zsír.
Hogy néz ki a kódod? OracleCommand rátolva a datagridview-ra?
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
Sajnos nem, ennél bonyolultabb.
Először egy picit off:
A probléma, mint mondtam, nem az sql "oldalon" van, hanem c# .net résszel.
Ugye c# - nevezzük innen Ő-nek, offline dolgozik DataSettel, DataTablele, stb-vel.
Offline szuper programozni, kényelmes, csak pl.: tallózom a betöltött DataSetet, majd egy kliens felvisz egy rekordot.
Én egész addig nem látom, amíg újra nem töltöm a táblát. (Lehet, hogy van megoldás, csak én nem tudom... végül is ezért nyitottam a topikot....)
Szóval egyész egyszerűen nem tudom tallózni a táblát. Igazából nem értem az MS elképzelését, miért kellett ez így megcsinálni, és nem meghagyni az "on-line" kezelést.
Mivel nekem kell 'lekezelnem' mindent,- mint ahogy mondtam nincs oszlop sorba rendezés,- tudom meg kell írnom a szükséges metódust,- nincs databinding, és egy csomó kényelmes eszköz, ami nekem, mint programozó válláról levenné a kuli munkát, és tényleg csak a lényegre kellene koncentrálni.
Egyébként a témanyitáskor, még mielőtt bármit is szóltam volna, és leszóltak,- arra gondoltam, hogy vannak olyan 3rd szoftverek, amivel ez a probléma áthidalható - de ezekben nincs semmilyen tapasztalatom, pl: DataObjects for .NET.
Ebben egész egyszerűen,-ha leírásoknak hinni lehet van egy DataAccess property= Virtual property, és innentől kezdve nekem nem kell foglalkoznom azzal, hogyan olvasom az adatokat a nagy táblából, csak megkapom az adatokat, és minden kénylemes eszközöm rendelkezésre áll, úgy mint off-line esetben. (Bocs, hogy ennyire egyszerűsítettem).
Visszatérve kérdésedre:
DataGridView.CellValueNeeded metódusát felhasználva én magam töltöm az adatokat. Maga a program két szegmenssel dolgozik, ha a egyikben sincs meg a kért adat, akkor törlés, szegmens tölt, és minden mehet tovább.
Ha érdekel, elküldhetem a kódot. Igaz, nem saját szerzemény, google segített, én csak egy iciripicit tettem hozzá, de sajnos még kell fejleszteni rajta.
Tehát nem asp.net-et használsz?
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
Hat igen, ha valaki nem specifikalja, hogy mi a problemaja, eleg nehez neki segiteni :-) A C# tul sok mindent lefed.
--
Jogos, igazad van. + sok.
Akkor gondolom most már világos a probléma .... ?
http://troels.arvin.dk/db/rdbms/#select-limit-simple
--
CCC3
Most kezdtem próbálgatni a ComponentOne DevStudiot.
Itt külön fejezetet szentelnek a : Dealing with Large DataSets (VirtualMode) használatának.
Azt hiszem, - mivel kevés időm volt rá eddig,- megoldás lesz a problémámra,- magyarul 'on-line' tallózgatok a táblában.......
Hála istennek sikerült "megoldani" a problémát.
A megoldás : DevXpress XPO.
Köszönöm mindenkinek a segítséget.