Ü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.
- 3076 megtekintés
Hozzászólások
"most a sajátomat szándékosan nem említeném"
még szerencse, ezek után...
- A hozzászóláshoz be kell jelentkezni
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...
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
gyökerek mindenhol vannak, illetve mi az adatbáziskezelőd?
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
- A hozzászóláshoz be kell jelentkezni
Bocs, ezt nem említettem, Oracle.
A baj nem az adatbáziskezelővel van, hanem megjelenítéskor a DataGridViewval.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
A DataGridView nem erre való. Használj ListView-t, VirtualMode-ban, az pont erre van kitalálva.
- A hozzászóláshoz be kell jelentkezni
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).
- A hozzászóláshoz be kell jelentkezni
:o
ez most komoly?
- A hozzászóláshoz be kell jelentkezni
Most, hogy lassan körvonalozódik maga a probléma, már mást is írhattam volna.
- A hozzászóláshoz be kell jelentkezni
a problematol fuggetlenul tablak kozott masolgatni szerintem eleg szerencsetlen dolog.
- A hozzászóláshoz be kell jelentkezni
Az. Vannak esetek, amikor ez kell.
- A hozzászóláshoz be kell jelentkezni
SqlCommanddal a szerveren hajtod végre a lekérdezéseket, nem pedig DataSetet használsz, majd a command eredményét jeleníted meg.
- A hozzászóláshoz be kell jelentkezni
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.........
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Na, a ROWID-t kifelejtettem, mentségemre szóljon, hogy soha nem használtam Oracle-t. :)
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
+1.
Azért írtam rank()-et felhasználva, mert abban már a rendezés is benne van.
- A hozzászóláshoz be kell jelentkezni
rank() helyett nem row_number() kellene?
KisKresz
- A hozzászóláshoz be kell jelentkezni
de igen, mert a subquery 75-ig adja vissza.
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
- A hozzászóláshoz be kell jelentkezni
Teljes select:
select mezonev from(select sorszam,rank() over (order by rendezettseg) as rank_sorszam from tabla) where rank_sorszam between alsolimit and felsolimit
- A hozzászóláshoz be kell jelentkezni
Maximum, ha a ROWNUM-ot a subqueryben visszaadod egy normál oszlopként.
Szerk.: Úgy valóban működik.
KisKresz
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Tehát nem asp.net-et használsz?
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
- A hozzászóláshoz be kell jelentkezni
Hat igen, ha valaki nem specifikalja, hogy mi a problemaja, eleg nehez neki segiteni :-) A C# tul sok mindent lefed.
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant.
- A hozzászóláshoz be kell jelentkezni
Jogos, igazad van. + sok.
Akkor gondolom most már világos a probléma .... ?
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
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.......
- A hozzászóláshoz be kell jelentkezni
Hála istennek sikerült "megoldani" a problémát.
A megoldás : DevXpress XPO.
Köszönöm mindenkinek a segítséget.
- A hozzászóláshoz be kell jelentkezni