![]() |
|
|||||||
| Newsgroup microsoft.public.de.german.entwickler.dotnet.datenbank Forum microsoft.public.de.german.entwickler.dotnet.datenbank |
![]() |
|
|
Themen-Optionen | Ansicht |
|
#1
|
|||
|
|||
|
Hallo,
ich habe eine große Datenbanktabelle (ca. 10000 Datensätze), die ich in einem DataGrid anzeigen möchte. Nun möchte ich aber nicht alle Datensätze sofort holen, sondern erst vielleicht 100 laden und beim runterscrollen nachher immer wieder neue Datensätze nachladen. Am Anfang hole ich mir z.B. so die Daten: SELECT Top 100 Name, Vorname, Nr FROM tbl_Mitarbeiter ORDER BY Name ASC, Vorname ASC Nun möchte ich nachher die nächsten hundert Datensätze laden, aber wie realisiere ich das per Statement, da ich ja nicht nur wieder 100 Datensätze ermitteln muss, sondern das sollen ja dann die 100 sein, die nach dem letzten Datensatz kommen? Vielen Dank schonmal im Voraus für eure Antworten. MfG Maik T. |
|
|
||||
|
||||
|
|
|
#2
|
|||
|
|||
|
"Maik T." <doug4king*web.de> schrieb im Newsbeitrag
news:hd1cnh$e1v$1*online.de... > ich habe eine große Datenbanktabelle (ca. 10000 Datensätze), die ich in > einem DataGrid anzeigen möchte. Nun möchte ich aber nicht alle Datensätze > sofort holen, sondern erst vielleicht 100 laden und beim runterscrollen > nachher immer wieder neue Datensätze nachladen. > > Am Anfang hole ich mir z.B. so die Daten: > > SELECT Top 100 Name, Vorname, Nr FROM tbl_Mitarbeiter ORDER BY Name ASC, > Vorname ASC > > Nun möchte ich nachher die nächsten hundert Datensätze laden, aber wie > realisiere ich das per Statement, da ich ja nicht nur wieder 100 > Datensätze ermitteln muss, sondern das sollen ja dann die 100 sein, die > nach dem letzten Datensatz kommen? Hi Maik, das könnte beispielswiese so aussehen: SELECT Top 100 Name, Vorname, Nr FROM tbl_Mitarbeiter WHERE ID NOT IN (SELECT TOP 100 ID FROM tbl_Mitarbeiter ORDER BY Name ASC) ORDER BY Name ASC, Vorname ASC -- Viele Gruesse Peter |
|
#3
|
|||
|
|||
|
Peter Fleischer schrieb:
> Hi Maik, > das könnte beispielswiese so aussehen: > > SELECT Top 100 Name, Vorname, Nr FROM tbl_Mitarbeiter > WHERE ID NOT IN > (SELECT TOP 100 ID FROM tbl_Mitarbeiter ORDER BY Name ASC) > ORDER BY Name ASC, Vorname ASC > Hi Peter, ich steig da leider noch nicht so ganz hinter! Beim ersten Laden hole ich mir ja ganz normal z.B. die ersten 100 Datensätze aus der Tabelle. Wenn ich nun die nächsten haben möchte, also Records 101-200, muss ich da nicht dann die Guid des letzten Datensatzes, sprich vom 100. mitgeben, damit man weiß ab wo man die Datensätze holen soll? Oder müsste ich dann einfach beim nächsten Durchlauf "SELECT Top 200" usw. nehmen? Vielen Dank schonmal für deine Antwort! MfG Maik T. |
|
#4
|
|||
|
|||
|
Hallo Maik,
> ich habe eine große Datenbanktabelle (ca. 10000 Datensätze), die ich in > einem DataGrid anzeigen möchte. Nun möchte ich aber nicht alle Datensätze > sofort holen, sondern erst vielleicht 100 laden und beim runterscrollen > nachher immer wieder neue Datensätze nachladen. Bei 10.000 Datensätzen hiesse das, dass der Benutzer den gesuchten Datensatz im schlechtesten Fall erst nach dem 99. Nachladen finden würde. Falls es ein Feld in Deinen Datensätzen gibt, das als Suchkriterium dienen könnte, wäre eine Suche nach einem bestimmten Datensatz damit möglicherweise deutlich kürzer und effizienter. Ein Beispiel wäre z.B. eine Tabelle mit Artikeln, die u.a. auch durch ein Feld Artikelgruppe gekennzeichnet sind. Der Benutzer sollte dann die Möglichkeit haben, einen Suchbegriff einzugeben (z.B. ArtikelGruppe) und dieser könnte dann in ein SQL-Statement der Art Select * from Tabelle Where FeldX = Suchbegriff einfliessen. Beschreibe doch einfach mal, wie die Datensätze in Deiner DB-Tabelle aussehen (Felder/Felddatentypen) und nach welchen Feldinhalten sinnvollerweise gesucht werden könnte. Das wäre natürlich nur dann sinnvoll, wenn ein oder mehrere Datensätze gesucht werden sollen, die bestimmte Kriterien erfüllen. Du solltest deshalb auch mal beschreiben, zu welchem Zweck die Daten in Deinem Grid angezeigt werden sollen. Gruß aus St.Georgen Peter Götz www.gssg.de (mit VB-Tipps u. Beispielprogrammen) |
|
#5
|
|||
|
|||
|
Hi Maik,
wenn es sich um SQL Server handeln sollte, schau mal hier: http://www.sqlteam.com/article/serve...ql-server-2005 falls du hierfür noch dynamische Filter benutzen willst, schau hier: http://www.sommarskog.se/dyn-search-2005.html Viele Grüße Christoph "Maik T." <doug4king*web.de> schrieb im Newsbeitrag news:hd27ub$5vd$1*online.de... > Peter Fleischer schrieb: > >> Hi Maik, >> das könnte beispielswiese so aussehen: >> >> SELECT Top 100 Name, Vorname, Nr FROM tbl_Mitarbeiter >> WHERE ID NOT IN >> (SELECT TOP 100 ID FROM tbl_Mitarbeiter ORDER BY Name ASC) >> ORDER BY Name ASC, Vorname ASC >> > > Hi Peter, > > ich steig da leider noch nicht so ganz hinter! Beim ersten Laden hole ich > mir ja ganz normal z.B. die ersten 100 Datensätze aus der Tabelle. Wenn > ich nun die nächsten haben möchte, also Records 101-200, muss ich da nicht > dann die Guid des letzten Datensatzes, sprich vom 100. mitgeben, damit man > weiß ab wo man die Datensätze holen soll? > > Oder müsste ich dann einfach beim nächsten Durchlauf "SELECT Top 200" usw. > nehmen? > > Vielen Dank schonmal für deine Antwort! > > MfG > Maik T. |
|
#6
|
|||
|
|||
|
Hallo,
die Daten soll man abrufen, um sie nachher bearbeiten zu können. Filterkriterien wären z.B. der Name oder die Nr.. Ist es eigentlich auch möglich per SQL-Statement, die Datensätze 21-40 zu ermitteln? Sprich sowas in der Art wie...... "SELECT Top Datensätze 21-40 Name, Vorname, Nr FROM tbl_Mitarbeiter ORDER BY Nr" MfG Maik T. |
|
#7
|
|||
|
|||
|
Hallo Maik,
> die Daten soll man abrufen, um sie nachher bearbeiten zu können. Ich interpretiere das mal so, dass der Benutzer die Daten eines ganz bestimmten Mitarbeiters oder eine Gruppe bestimmter Mitarbeiter bearbeiten will. Also z.B. alle Mitarbeiter die jünger als 30 Jahre sind, oder alle Mitarbeiter die eine bestimmte Gehaltsgruppe haben usw., usw. ... Filterkriterium wären dann z.B. Geburtsdatum oder die Gehaltsgruppe. > Filterkriterien wären z.B. der Name oder die Nr.. > > Ist es eigentlich auch möglich per SQL-Statement, die Datensätze 21-40 zu > ermitteln? > > Sprich sowas in der Art wie...... > > "SELECT Top Datensätze 21-40 Name, Vorname, Nr FROM tbl_Mitarbeiter ORDER > BY Nr" Wenn Du damit die Datensätze meinst, bei denen das Feld "Nr" einen Wert im Bereich von 21 bis 40 hat, dann wäre das am einfachsten: "Select [Name], Vorname, Nr From tbl_Mitarbeiter " & _ " Where Nr Between 21 And 40 Order By Nr" Gruß aus St.Georgen Peter Götz www.gssg.de (mit VB-Tipps u. Beispielprogrammen) |
|
#8
|
|||
|
|||
|
Hallo Maik,
> Am Anfang hole ich mir z.B. so die Daten: > > SELECT Top 100 Name, Vorname, Nr FROM tbl_Mitarbeiter ORDER BY Name ASC, > Vorname ASC > > Nun möchte ich nachher die nächsten hundert Datensätze laden, aber wie > realisiere ich das per Statement, da ich ja nicht nur wieder 100 Datensätze > ermitteln muss, sondern das sollen ja dann die 100 sein, die nach dem > letzten Datensatz kommen? in einem der letzten dotnet-Magazine war da mal ein Beispiel wie man sowas machen kann. Für deinen Fall sähe das so aus: SELECT Name, Vorname, Nr FROM (SELECT ROW_NUMBER() OVER (ORDER BY Name ASC) AS Zeile, Name, Vorname, Nr FROM tbl_Mitarbeiter) AS t WHERE Zeile BETWEEN 100 AND 200 Grüße André |
|
#9
|
|||
|
|||
|
Hallo Maik!
Ich habe im Moment genau dasselbe Problem wie du! Ich beschäftige mich mit dieser Problematik schon einige Zeit. Ich arbeite mit Tabelle die weit über 7.000.000 Datensätze haben und will mich auch "Seitenweise" durch diese bewegen, sprich immer nur 100 Datensätze laden und dann ggf. nachladen. Mein Problem ist nur das ich verschiedene DBMS unterstützen muss (Access, SQL 2000, 2005, 2008). AB SQL 2005 wär das ja alles gar kein Problem mit dieser schönen "ROW_Number"-Funktion, nur was mach ich mit Access und SQL 2000? Mein 2ter Ansatz war, dass ich einen DataReader benutz und immer 100 Datensätze nachlade. Problem ist nur, dass nur einen DataReader pro Connection zulässig ist. Ab SQL 2005 gibt es es die Möglichkeit auch mehrere DataReader parallel zu öffnen. Stichwort Multiple Active ResultSets (MARS). Mein 3ter Ansatz war, ein DataSet bzw. DataTable zu verwenden und diese per DataAdapter.Fill zu füllen. Eine Überladung, dieser Methode, stellt die Möglichkeit bereit, dass man einen "StartRecord" und "MaxRecord" angeben kann. Problem ist nur, dass diese Methode mehr als 2min benötigt um z.B. 100 Datensätze zu laden. Das ist auch nicht hinnehmbar für mich. Mein 4ter Ansatz war eine zusätzliche Identitätsspalte in die Tabelle einzufügen und dann mit einem BETWEEN-Statement zu arbeiten. Nur dies funktioniert auch nicht, sobald der Benutzer nach einer andern Spalte sortieren würde, z.B. Name. Es muss doch eine Möglichkeit geben in VB.NET mit großen Datenmengen umgehen zu können. Perfekt für mich wäre es, wenn ich auch noch navigieren könnte, d.h. Springe zum ersten/letzten Datensatz etc. Vielleicht hate jemand noch einen anderen Ansatz für mich... MfG Markus Gries |
|
|
|
|
![]() |
| Themen-Optionen | |
| Ansicht | |
|
|
Ähnliche Themen
|
||||
| Thema | Erstellt von | Forum | Antworten | Letzter Beitrag |
| Mail weiterleiten ohne Bilder nachzuladen | Maximilian Schenker | Newsgroup microsoft.public.de.outlook | 1 | 04-17-2009 08:24 AM |
| SQL-Statement | Dieter Schirmer | Newsgroup microsoft.public.de.access | 5 | 11-23-2008 04:15 PM |
| SQL STatement | Norbert Stellberg | Newsgroup de.comp.lang.delphi.datenbanken | 4 | 10-17-2008 05:42 PM |
| Sicherheitsabfrage SQL-Statement | Ahmed Martens | Newsgroup microsoft.public.de.word.vba | 3 | 10-02-2008 07:09 AM |
| DISTINCT im SQL-Statement | Dieter Schirmer | Newsgroup microsoft.public.de.vb.datenbank | 2 | 04-14-2008 07:33 AM |