[ radicr @ 25.07.2004. 20:39 ] @
Pozdrav

Malo pocinjem da radim C# i ucim ADO.NET
Hocu da napravim neki DataGrid (windows.Forms) koji bi mogao da radi "pametno ucitavanje" u smislu, da kad imam npr. 12 prikazanih vrsta, da iz baze ucitam samo 12 i onda kad korisnik skroluje da ucitavam naredni 1 ili vise rekorda u zavisnosti od navigacije.
Iz razloga toga sto mi xxxDataAdapter.Fill(dataSet) radi previse sporo, posto on fetchuje sve podatke iz tabele, mislio sam da cu moci iskoristiti xxxDataReader za tako nesto ovako:
while (DataReader.Read() && (rowsAdded < visibleRows))
{
AddRow();
rowsAdded++;
}
i onda kad skrolne uradim jos jedan DataReader.Read()
Ali koliko sam procitao xxxDataReader mora da uradi Close() jer je inace xxxConnection u stanju Fetching, i ne mogu da radim BeginTransaction() i update u bazu posto stanje mora biti ConnectionState.Open , odnosno to mi se desava kad radim sa OleDbDataReader i OleDbDataConnection.
A kad uradim DataReader.Close() onda ne mogu raditi postepeni fetching vec moram ucitati sve odjednom sto daje bar neko ubrzanje u odnosu na DataAdapter.Fill(dataSet) ali ipak ne zadovoljava. Je li ima neko rjesenje za ovo?

Hvala,
Radovan
[ bunker @ 26.07.2004. 02:39 ] @
tako nesto sam realizovao u javi, na MySql, ali mySql ima
select * from table limit x,y
i vracca samo redove izmedju x i y.

koji db server koristis?
MSSQL ima select top x, kol'ko znam, ali ne znam za od do....
[ jablan @ 26.07.2004. 07:57 ] @
Citat:
radicr: Hocu da napravim neki DataGrid (windows.Forms) koji bi mogao da radi "pametno ucitavanje" u smislu, da kad imam npr. 12 prikazanih vrsta, da iz baze ucitam samo 12 i onda kad korisnik skroluje da ucitavam naredni 1 ili vise rekorda u zavisnosti od navigacije.


Bez obzira što ti ne radiš odmah DataReader.Read(), tebi je ceo query već izvršen, tako da nemaš praktično nikakve uštede. Kad kažeš skrolovanje, nadam se da ne misliš na skrolovanje za po 1, pošto bi to bila smrt da tražiš jedan po jedan slog iz baze.

Ako misliš na pejdžing, to već može. Nažalost, za razliku od MySQL-a, u MS SQL Serveru ne postoji legalan način da se kverijem povuku samo slogovi od n do n+pageSize.

Ali što bi rekli, može da se nabudži, tako što se uradi "TOP na TOP", tj, prvo se uzme prvih n+pageSize, pa se onda na to uradi TOP n, ali u obrnutom redosledu. Naravno, sve ovo u okviru neke stored procedure jer inače nema efekta. Pogledaj po netu, ima dosta članaka na tu temu ("MS SQL paging" ili sl.).
[ radicr @ 26.07.2004. 12:26 ] @
Nebitno za bazu, pokusavam da uradim nevezano za bazu. Znaci kad dodijelim datasource gridu, znacu nekako da li je ucitan preko DataReder ili DataAdapter i onda hocu ako je preko DataReadera da ucitavam rekorde po potrebi.
Nije problem samo u izvrsavanju upita, vec je problem u prebacivanju rezultata upita u DataSet/DataTable. Npr. delphi DBGrid ima tu opciju, odnosno njegov TDataSet ucitava rekorde po potrebi, bar ja mislim da je tako.