MySQL Tabelle in Gridview laden, Perfomance problem

Wie auf MySql und den ganzen Rest zugreifen ...

MySQL Tabelle in Gridview laden, Perfomance problem

Beitragvon Ray65 » So 5. Dez 2010, 10:47

Hallo Community,

hoffentlich geht bei den vielen Spams mein Tread nicht unter... 8-)
Folgendes Problem:
Ich habe einen MySQL Datenbank und eine Tabelle der gefüllt ist mit Postleitzahlen (19.670 Einträge !).
Mit folgender Methode wird der Gridview gefüllt:
Code: Alles auswählen
  DIM iRow AS Integer

  GridViewData.Clear
  GridViewData.Rows.Count = $rsData.Count
  $rsData.MoveFirst
  FOR iRow = 0 TO $rsData.Count - 1
    GridViewData[iRow, 0].Text = $rsData!plz_id
    GridViewData[iRow, 1].Text = $rsData!plz
    GridViewData[iRow, 2].Text = $rsData!ort
    GridViewData[iRow, 3].Text = $rsData!angelegt_am
    GridViewData[iRow, 4].Text = $rsData!loginname
    $rsData.MoveNext
  NEXT

Nun habe ich das Problem dass mein Programm ca. 25 Sekunden braucht um das Gridview zu laden. Gibt es eine alternative Weg ein GridView schneller zu füllen? Mein erster Gedanke war nur ca. 1.000 Einträge zu laden und beim herunterscrollen parallel die Rest zu laden. Ist aber kein schöner Lösung.

Danke im voraus
Ubuntu 12.04 - Gnome 3.4.1 - Gambas 3.3.3

"Man kann kein Programm idiotensicher machen, weil die Idioten so erfinderisch sind!"
Benutzeravatar
Ray65
Foriker
 
Beiträge: 113
Registriert: Fr 3. Okt 2008, 15:00
Wohnort: Königseggwald, Ba-Wü

Re: MySQL Tabelle in Gridview laden, Perfomance problem

Beitragvon Honsek » Do 9. Dez 2010, 14:58

Hallo Raymond,

mit einer so großen Anzahl von Datensätzen hatte ich bisher nicht zu tun. Daher mein Vorschlag: Nutze für eine Anzeige (!) von Datensätzen die dafür entwickelten Komponenten aus dem Container "Data". Ich verwende DataBrowser - alles drin, alles dran; keine weiteren Angaben und die Anzeige steht! Im übrigen kannst Du ja mal das Beispiel "Datenbank/DataBase" öffnen und nutzen sowie dort die Performance erleben. Hier ein Ausschnitt aus einem DB-Programm mit SQLite3:

Code: Alles auswählen
PUBLIC SUB Form_Show() 
  DIM sSQL_Anweisung AS String
 
  DataSource1.Table = "adressen"
 
  dcNachname.Field = "Nachname" ' DB-Feld (datensensitiv)
  dcVorname.Field = "Vorname"
  cdWohnort.Field = "Wohnort"
  dcPLZ.Field = "PLZ"
  dcStrasse.Field = "Strasse"
  dcEMailAdresse.Field = "EMailAdresse"
  dcWebAdresse.Field = "WebAdresse"
  dcGebDatum.Field = "GebDatum"
  dcHinweise.Field = "Hinweise"
  dcTelefonFestnetz.Field = "TelefonFestnetz"
  dcTelefonMobil.Field = "TelefonMobil"
 
  DataBrowser1.GridView.Columns[0].Width = 45
  DataBrowser1.GridView.Columns[1].Width = 100
  DataBrowser1.GridView.Columns[2].Width = 100
  DataBrowser1.GridView.Columns[3].Width = 110
  DataBrowser1.GridView.Columns[4].Width = 50
  DataBrowser1.GridView.Columns[5].Width = 160
 
  sSQL_Anweisung = "SELECT * FROM " & DataSource1.Table
  MDataBase.rDBResult = MDataBase.cDBVerbindung.Exec(sSQL_Anweisung)
 
  IF MDataBase.rDBResult.Available THEN
     MDataBase.rDBResult.MoveFirst ' Kann entfallen ...
     DataBrowser1.GridView.MoveTo(0, 0) ' Notwendig für Sprung in die erste Zeile!
  ENDIF
 
END ' Form_Show


Mit freundlichem Gruß

Honsek
---> Wenn Du eine gute Antwort erwartest, musst Du sehr gut fragen!
Benutzeravatar
Honsek
Foriker
 
Beiträge: 330
Registriert: Do 4. Okt 2007, 17:01

Re: MySQL Tabelle in Gridview laden, Perfomance problem

Beitragvon Honsek » Do 9. Dez 2010, 15:12

Hallo Raymond,

das Folgende passt gut zum Thema Postleitzahlen und deren Prüfung mit einem regulären Ausdruck.
Es wird in der u.a. Prozedur geprüft, ob die in eine Textbox eingegebene Postleitzahl eine korrekte deutsche Postleitzahl ist.

Code: Alles auswählen
' Gambas class file

' gb.pcre  --->  Perl Compatible Regular Expression matching einbinden

...
PUBLIC SUB btnPruefungPostleitzahl_Click()
  ' [0-9]{5} ---> genau 5 Ziffen aus dem Interval [0..9]
  ' \b((?:0[1-46-9]\d{3})|(?:[1-357-9]\d{4})|(?:[4][0-24-9]\d{3})|(?:[6][013-9]\d{3}))\b
  ' The postal codes starts with the two digit "Leitzahl".
  ' This is a number between 00 and 99 excluding the not yet used numbers: 00, 05, 43 and 62!
  ' After that follows directly a three digit number, 000-999.
 
  ' LINK: http://www.regexlib.com/UserPatterns.aspx?authorId=d3feb72b-eb72-4325-a9b8-4fd9aae266fb
  ' Autor: Markus Matern

  DIM RegexPLZ AS Regexp
 
  btnPruefungPostleitzahl.BackColor = Color.ButtonBackground

  ' TRY RegexPLZ = NEW Regexp(txtPostleitzahl.Text, "[0-9]{5}")   ' Hier sind Fehler möglich ---> 00, 05, 43 and 62 !
  TRY RegexPLZ = NEW Regexp(txtPostleitzahl.Text, "\\b((?:0[1-46-9]\\d{3})|(?:[1-357-9]\\d{4})|(?:[4][0-24-9]\\d{3})|(?:[6][013-9]\\d{3}))\\b")   
  IF ERROR THEN
     Message.Error("Fehler: " & Error.Text & Chr(10) & "  Fehlerquelle: " & Error.Where)
     RETURN
  ENDIF
  IF RegexPLZ.Text <> txtPostleitzahl.Text THEN
     btnPruefungPostleitzahl.BackColor = Color.Red
     Message.Error("Fehler: " & Error.Text & Chr(10) & "Die Postleitzahl " & txtPostleitzahl.Text & " ist fehlerhaft!")
     RETURN
  ELSE
     btnPruefungPostleitzahl.BackColor = Color.Green
  ENDIF   
 
END ' PrüfungPostleitzahl


Dieser Nachtrag ist nur eine Anregung, die PLZ vor dem Speichern zu überprüfen. Denn trivial ist es nicht, wie die Ausnahmen zeigen. Ein selbst entwickelter kleiner Parser leistet die gleichen Dienste - nur ist die Lösung mit REGEX m.E. recht elegant.

Mit freundlichen Grüßen

Honsek
---> Wenn Du eine gute Antwort erwartest, musst Du sehr gut fragen!
Benutzeravatar
Honsek
Foriker
 
Beiträge: 330
Registriert: Do 4. Okt 2007, 17:01

Re: MySQL Tabelle in Gridview laden, Perfomance problem

Beitragvon Ray65 » Fr 10. Dez 2010, 20:41

Hallo Honsek,

danke für deine Antworten. Die mitgelieferte Datenbrowser und -Gridview mag ich nicht so sehr. Die sind mir zu unflexibel. Beim Datengrid lassen sich nicht mal die Columnenüberschriften ändern. Eine Geschwindigkeitstest werde ich aber noch probieren.
Zu meine Windows Zeiten habe ich früher mit Profan programmiert. Da hat man immer gesagt eine Wend-While Schleife ist eine For-Next Schleife aus Geschwindigkeitsgründe vorzuziehen. Das habe ich auch schon ausprobiert, aber ohne messbare Gewinn.
Ubuntu 12.04 - Gnome 3.4.1 - Gambas 3.3.3

"Man kann kein Programm idiotensicher machen, weil die Idioten so erfinderisch sind!"
Benutzeravatar
Ray65
Foriker
 
Beiträge: 113
Registriert: Fr 3. Okt 2008, 15:00
Wohnort: Königseggwald, Ba-Wü

Re: MySQL Tabelle in Gridview laden, Perfomance problem

Beitragvon Ray65 » Fr 10. Dez 2010, 21:04

Hallo,

ich habe es gerade mit einem Dataview probiert. Nun bin ich aber Platt... 19.670 Datensätze in gerade mal ne halbe Sekunde... :shock: :?
Ich möchte jetzt aber nicht unbedingt mein ganzes Programm umstellen. Dann werde ich werde mal weiter suchen.

bis bald
Ubuntu 12.04 - Gnome 3.4.1 - Gambas 3.3.3

"Man kann kein Programm idiotensicher machen, weil die Idioten so erfinderisch sind!"
Benutzeravatar
Ray65
Foriker
 
Beiträge: 113
Registriert: Fr 3. Okt 2008, 15:00
Wohnort: Königseggwald, Ba-Wü

Re: MySQL Tabelle in Gridview laden, Perfomance problem

Beitragvon Ray65 » Sa 18. Dez 2010, 23:22

Hallo Community,

Problem gelöst: verantwortlich für ein schnelles Daten laden ist das '_Data' - Event. Datensätze in ein Array laden und dann mit folgender Sub in das Gridview laden:

Code: Alles auswählen
PUBLIC SUB GridViewData_Data(Row AS Integer, Column AS Integer)

  GridViewData.Data.Text = arData[Row][Column]

END


Braucht bei 19.000 Datensätze eine knappe Sekunde.

Grüsse Raymond
Ubuntu 12.04 - Gnome 3.4.1 - Gambas 3.3.3

"Man kann kein Programm idiotensicher machen, weil die Idioten so erfinderisch sind!"
Benutzeravatar
Ray65
Foriker
 
Beiträge: 113
Registriert: Fr 3. Okt 2008, 15:00
Wohnort: Königseggwald, Ba-Wü


Zurück zu Datenbankzugriff

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron