En DataReader er skabt til den situation hvor at du blot far brug for at starte ved første række i en tabel og så læse til sidste række. Hvis du har brug for at kunne hoppe tilfældigt frem og tilbage efter eget behag så er det derimod et dataset du skal bruge.
Med et dataset læses hele tabellen ind i din hukommelse, og hvis tabellerne er stor som du angiver så kommer serveren nok til at blive sløvet ned pga. intens swapping.
Ja, det er er muligt at begrænse antaller af rækker der læses ind af gangen. Teknikken hedder paging og den bruges meget på web'et hvor at man f.eks. ønsker at vise 10 poster af gangen med mulighed for at gå tilbage og frem til de næste 10.
SELECT ditFelt1, ditFelt2 FROM ( SELECT ditFelt1, ditFelt2, rownum n FROM ( SELECT ditFelt1, ditFelt2 FROM dinTabel ORDER BY ditFelt2 DESC ) ) WHERE n BETWEEN 11 AND 20
Umiddelbart ville jeg tro at det kunne gøres nemmere, men jeg kan ikke lige finde nogle bedre resourser.
mht paging så ved jeg ikke på forhånde hvor mange rækker der er i hver tabel. det skulle bare være for at mindske hukommeses forbruget ved at indlæse eks. 1000 rækker ad gangen
Bruger man paging kan man sagtens tage højde for et ukendt antal rækker; Det er simpelthen at tjekke om du nu også fik fulde 1000 rækker tilbage fra din seneste select. Hvis du gjorde det, så beder du bare om at få de næste 1000 og hvis ikke ja så er du ved enden af din tabel.
Hvis du vælger at bruge en reader frem for et dataset så er der imidlertid slet ingen grund til at spekulere i en løsning baseret på paging; Her er der nemlig kun én række i memory ad gangen.
for (int i=0; i<reader.FieldCount; i++) { Console.WriteLine(myReader.GetString(i)); }
- tager alle kolonnerne ud, så den der med "specifik kolonne" holder ikke. I stedet skal du så angive indexet på den specifikke kolonne med myReader.GetString(indekset). Altså bare:
Console.WriteLine(myReader.GetString(5));
- hvis det er data fra 6. kolonne du er intereseret i.
Ja, dit script vil høre med mask hastighed. Jeg ved ikek om det er noget som ville kunne føles på serveren, men odds er da for det. Hvis dette er et problem kan du jo bare lægge nogle pauser ind i din loop (Thread.Sleep(500) for en pause på 500 ms).
Du skal jo ikke holde pause efter hver eneste loop - for det er ikke nødvendigt og så bliver dit script aldrig færdig. Nu er det jo ikke en gang sikkert at det er noget problem overhovedet, men det kunne jo f.eks. se sådan her ud:
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.