ERLEDIGT
NEIN
NEIN
ANTWORTEN
20
20
ZUGRIFFE
869
869
EMPFEHLEN
-
Hallo

ich habe folgende problem:
mein tool welches ich gerade programmiere, hat eine katastrophale laufzeit in der Datenbindung. ich habe ein datagrid und ein dazugehöriges dataset. dazu habe ich noch ein suchfeld gebaut. in dem dataset habe ich ca 3000 einträge (mit 500 oder sogar weniger habe ich das gleiche problem) wenn ich jetzt z.b. nach dem namen peter suchen würde, hätte ich mind. 5 sekunde wo das programm hängt. das liegt daran das ich nach jeden buchstaben das dataset neu laden muss. ich habe es dann mal probiert mit dem dataset zuarbeiten. so das ich einmal am anfang alle daten lade und dann darin dann nur noch die abfrage mache. das hat dann aber zur folge das meine daten nicht mehr aktuell sind, da auf die datenbank mehrere leute zugreifen und auch ändern können.
also muss ich irgendwie versuchen immer die aktuellen daten in einer angemessenden zeit zubekommen.
ich hoffe mir kann da jemand weiterhelfen
vielen dank im vorraus
-
20.08.10 12:17 #2
Hi xlon,
welche Datenbank-System hast du denn? Das sind übertriebene Zeiten...
Als Optimierung kannst du z. B. einbauen, das die Suche erst ausgelöst wird, wenn 500 ms - 1 Sekunde (kannst ja machen wie du willst!) keine Eingabe gemacht wurde. Bei jedem Tastendruck ist das nicht wirklich sinnvoll, so schnell kann eh kein Mensch die Ergebnisse sehen...
Desweiteren kannst du ja mal gucken, ob es möglich ist, die Daten asynchron abzufragen/einzutragen d. h. die Daten die vom SQL-Server schon verarbeitet und zurückgeliefert werden sollen in das Dataset geschrieben und angezeigt werden die anderen werden nach und nach übermittelt und das dataset um diese erweitert. Damit wird dein Grid "wachsen", da die Daten im Hintergrund geladen werden und deine Anwendung nicht erst auf die gesamte Ergebnismenge warten muss.
Gruß
RudolfGTechnologien
(Gute) Grundkenntnisse: HTML, CSS
Fortgeschrittene-Kenntnisse: C++/Qt, C# (WinForms, Webservice), SQL
-
Hallo Rudolf,
ich habe einen ganz normalen sql server 2005, das sind beides sehr gute vorschläge. nur wie mache ich das? wie mache ich eine abfrage ob 1 sekunde nichts gedrückt wurde? und wie kann ich die daten im hintergrund laden lassen
vielen dank für deine schnelle antwort, ich hoffe du kannst mir noch weiterhelfen
-
mach ich es denn genrell richtig das ich mein dataset so fülle. und das dann bei jeder änderung ausführe?
Code :1 2 3 4 5 6 7 8
einsatzuebersicht2DataSetTelNr = ((ServerState.Einsatzuebersicht2DataSetTelNr)(this.FindResource("einsatzuebersicht2DataSetTelNr"))); // Lädt Daten in Tabelle "AdminToolTelNr". Sie können diesen Code nach Bedarf ändern. einsatzuebersicht2DataSetTelNrAdminToolTelNrTableAdapter = new ServerState.Einsatzuebersicht2DataSetTelNrTableAdapters.AdminToolTelNrTableAdapter(); einsatzuebersicht2DataSetTelNrAdminToolTelNrTableAdapter.FillBy1(einsatzuebersicht2DataSetTelNr.AdminToolTelNr, melder); System.Windows.Data.CollectionViewSource adminToolTelNrViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("adminToolTelNrViewSource"))); adminToolTelNrViewSource.View.MoveCurrentToFirst();
-
20.08.10 14:47 #5
Hi xlon,
ganz normal
Naja bei so wenig Datensätzen, hätte ich eher auf Access oder so getippt. Ich kann es aber nicht wissen, sonst meint einer Access, MySQL, Firebird und ein ganz andere den Oracle-Server
Also ich habe in meinem Projekt von dem Eingabefeld abgeleitet, da einen Timer als Member angelegt, beim ersten Event, dass sich die Eingabe im Eingabefeld geändert hat starte ich den Timer, beim Auslösen des Events das die Zeit im Timer abgelaufen ist, löse ich die erneute Datenbankabfrage aus und stoppe den Timer.
Bei jedem Event, dass sich die Eingabe geändert hat, wird intern überprüft ob der Timer schon läuft, wenn ja wird er neugestartet (das er von neu die Zeit abwartet) und wenn nicht wird er gestartet.
Wie es im Einzelnen das mit dem Dataset geht kann ich dir leider nicht sagen, da mit dem noch nie gearbeitet habe. Aber die grundsätzliche Herangehensweise sollte sein, dass die Daten in einem Thread also asynchron abgefragt werden und zwischendurch (sobald Daten da sind) den UI-Thread mit diesen Daten aktualisieren. Vielleicht können die anderen dir hier mehr helfen, ich komme nämlich nicht aus der .NET sondern aus der C++/Qt-Welt
Gern geschehen, ich hoffe meine Ansätze helfen entweder dir oder regen andere an sich mit Ideen/Vorschlägen zu beteiligen
Gruß
RudolfGTechnologien
(Gute) Grundkenntnisse: HTML, CSS
Fortgeschrittene-Kenntnisse: C++/Qt, C# (WinForms, Webservice), SQL
-
mir hast du auf jeden fall geholfen...zumindestens den richtigen denk anstoß gebracht, ich werde jetzt mal in diese richtung vorschen.
wenn jemand genaures schon weiß, kann er mir das gerne mitteilen.
viele grüße
-
Hallo,
Wie es im Einzelnen das mit dem Dataset geht kann ich dir leider nicht sagen, da mit dem noch nie gearbeitet habe. Aber die grundsätzliche Herangehensweise sollte sein, dass die Daten in einem Thread also asynchron abgefragt werden und zwischendurch (sobald Daten da sind) den UI-Thread mit diesen Daten aktualisieren. Vielleicht können die anderen dir hier mehr helfen, ich komme nämlich nicht aus der .NET sondern aus der C++/Qt-Welt
Ein DataSet kann man sich wie eine Datenbank vorstellen,
es können Tabellen (DataTable) hinein geladen, Beziehungen erstellt werden und man kann selects (querys) machen, wie bei einer normalen Datenbank.
hat eine katastrophale laufzeit in der Datenbindung
Die extreme Laufzeit liegt wohl daran, dass du mit DataGridView, DataSet u.s.w. arbeitest, das ist in meinen Augen nicht für das gedacht, was Du machen willst, stell dir mal eine Flughafen-Datenbank vor, die das bewältigen müsste...
Wenn du Effizienter werden willst, solltest Du z.B. nicht immer gleich die ganze Datenbank nachladen,
Trigger einbauen oder nicht die ineffizientesten Klassen im .Net-Framework benutzen
LG VScanNetiquette (vA §15)
Codetags/Codeboxen
Sehr gut gelöste Beiträge bitte mit einem "Danke" abschließen, danke :D
-
ja aber wie kann ich denn "nicht immer die ganze datebank nachladen" und trotzdem "aktuell" bleiben? ich habe gestern noch gelesen das ich ja nicht immer alle daten aus der datenbank (spalten eines datensatzes) laden muss, nur die dich ich brauch.
wie bekomm ich es denn so schnell wie möglich? welche .net klasse brauche? bzw. welche nutze ich jetzt? ich bentutze ja den stand immoment.
danke für deine antwort
-
Hi,
wie läuft das mit deiner Datenbank genau, kann sich da in jeder Tabelle der Datenbank was ändern?
Wenn nicht, diese tabellen ausschließen!
In diesem Sinne stellt sich mir auch die Frage wer sich 500 Datensätze auf einmal anschaut
Muss da jeder User immer alles, auf dem aktuellen Stand angezeit bekommen? Wenn nein, nur das zeigen was interessant ist, in diesem Fall nur einen Datensatz aus der Datenbak holen, nicht die ganze Tabelle. Wenn nötig mit Transaktionen den Zugriff regeln bei der Datenbank.
Wenn du Deine Suchalgorythmen mit einer Datenbankabfrage machen kannst, tu das, denn eine Datenbank arbeitet effizienter als dein (oder mein XD) Programm.
MfGGeändert von VScan (21.08.10 um 20:08 Uhr)
Netiquette (vA §15)
Codetags/Codeboxen
Sehr gut gelöste Beiträge bitte mit einem "Danke" abschließen, danke :D
-
hallo,
die tabellen die ich lade, da kann sich jeder zeit etwas ändern.
also am besten wäre es wenn sich das datagrid nach und nach auffüllt. es sind in einer tabelle 3000 einträge. es dauert ja immer 5sekunden bis was kommt, dann ist aber auch direkt alles da. das muss ja nicht sondern halt immer noch und nach, aber ich weiß nicht wie das geht.
? versteh ich nicht.
-
Guten Morgen,
also wenn du immer "Alles" auf dem aktuellen Stand brauchst und angezeigt haben willst, wirds wohl nix helfen, dann würde ich die Tips von RudolfG beachten... hört sich Sinnvoll an.
Grundsätzlich würde ich aber sagen, dass das Laden ganzer Tabellen oder gar Datenbanken nicht sinnvoll ist, vorallem bei Daten die sich ständig ändern können durch andere Benutzer, würde ich die Anzeige der Daten halt Filtern(mit WHERE-Klausel), dann hast du auch nie Probleme, weil ja dann gar nicht so viel angezeigt werden muss (von der Datenbank geholt wird).
Mit Suchalgorythmen mein ich, dass du ja bestimmt Dein DataSet durchsuchst, nach bestimmten Datensätzen die angezeigt werden sollen oder? Mach das doch mit der Datenbank, die arbeitet schneller...
Könntest du mal anhand eines praktischen Beispiels erklären was du da eigentlich genauprogrammierst? Dann könnte man sich vielleicht mehr darunter vorstellen, natürlich möchte ich Dir nicht zu nahe treten
LGNetiquette (vA §15)
Codetags/Codeboxen
Sehr gut gelöste Beiträge bitte mit einem "Danke" abschließen, danke :D
-
ich programmiere ein tool welches problemmeldungen annimmt. 3 mit arbeiter legen problemmeldungen an, dann sollen die aber bei jedem zusehen sein.
dazu kann das tool auch computer verwalten (die daten z.b. rechnername, ip, die ganzen seriennummern, serviceTag, usw.)
bringt es auch was wenn ich mir im datagrid nur die sachen eines datensatzes einlese (nur das was im datagrid zusehen sein soll) und nicht immer alles? und wenn ich dann drauf klicke das dann ein neues formular kommt und wo dann alles zusehen ist?
-
27.08.10 11:33 #13
Für solche Probleme eignen sich Datenbank-Events (ob der MS-SQL-Server bzw. die Datenbank-Klassen den Zugriff auf die Events erlauben/ermöglichen weiß ich allerdings nicht!). Wir benutzen den Firebird-SQL-Server und unsere Anwendungen (in C++) registrieren ein Event, wenn dieser Event z. B. durch insert/update/delete trigger gefeuert wird, bekommen die Anwendungen es mit und können gezielt diesen einen Datensatz in neu laden.
So muss nicht die Anwendungen immer überprüfen ob neue/geänderte Daten vorhanden sind, sondern der SQL-Server (der es ja "weiß") meldet den Anwendungen ob und was sich geändert hat und diese müssen jetzt nur entsprechend darauf reagieren.
Das währe natürlich eine Optimierung, da weniger Daten geladen und verwaltet werden.
Gruß
RudolfGTechnologien
(Gute) Grundkenntnisse: HTML, CSS
Fortgeschrittene-Kenntnisse: C++/Qt, C# (WinForms, Webservice), SQL
-
Hallo,
ja! genau nach so was suche ich die ganze zeit. Das die Datenbank mir sagt, "es wurde etwas geändert, bitte neuladen".
Ich habe aber leider überhaupt keine ahnung von Datenbank programmierung. Ich weiß nur das es auf jedenfall schneller gehen muss, als es jetzt der fall ist.
ich weiß ja nicht ob ich denn generell einen fehler mache.
ist es denn richtig das ich jedes mal das hier ausführe:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
public void computerFilter() { try { if (txtComputerHome.Text.Length >= 2) { einsatzuebersicht2DataSetComputer = ((ServerState.Einsatzuebersicht2DataSetComputer)(this.FindResource("einsatzuebersicht2DataSetComputer"))); // Lädt Daten in Tabelle "DatagridComputer". Sie können diesen Code nach Bedarf ändern. ServerState.Einsatzuebersicht2DataSetComputerTableAdapters.DatagridComputerTableAdapter einsatzuebersicht2DataSetComputerDatagridComputerTableAdapter = new ServerState.Einsatzuebersicht2DataSetComputerTableAdapters.DatagridComputerTableAdapter(); einsatzuebersicht2DataSetComputerDatagridComputerTableAdapter.FillBy(einsatzuebersicht2DataSetComputer.DatagridComputer, txtComputerHome.Text); System.Windows.Data.CollectionViewSource datagridComputerViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("datagridComputerViewSource"))); datagridComputerViewSource.View.MoveCurrentToFirst(); } else { //einsatzuebersicht2DataSetComputer.Tables["DatagridComputer"].DefaultView.RowFilter = "aktAusgegebenAn LIKE 'DUMMY'"; } } catch { } } public void txtComputerHome_TextChanged(object sender, TextChangedEventArgs e) { computerFilter(); }
Ich kann mir aber nicht vorstellen das ich so sehr daneben liege.
Viele Grüße
-
27.08.10 14:21 #15
Guck mal ob dir dieser Artikel hilft:
http://msdn.microsoft.com/de-de/libr...1b(VS.80).aspx
Ansonsten hier noch etwas zu events, aber ob es dir hilft bzw. hilfreich sein kann weiß ich nicht:
http://www.exforsys.com/tutorials/sq...fications.html
Wie ich bereits in dem Post weiter oben gesagt habe, habe ich noch nie was mit diesen Komponenten gemacht und dementsprechend keine Ahnung. Aber vielleicht kann ja ein C#-Entwickler dir hierzu was sagen.
Gruß
RudolfGTechnologien
(Gute) Grundkenntnisse: HTML, CSS
Fortgeschrittene-Kenntnisse: C++/Qt, C# (WinForms, Webservice), SQL
Ähnliche Themen
-
Datenverwaltung zur Laufzeit (ohne Datenbank)
Von Augus im Forum .NET DatenverwaltungAntworten: 2Letzter Beitrag: 13.12.10, 11:58 -
C# schlechte Datenbank laufzeit
Von xlon im Forum .NET DatenverwaltungAntworten: 1Letzter Beitrag: 20.08.10, 15:05 -
[VC++] Access Datenbank zur Laufzeit erstellen
Von warcraft9105 im Forum .NET DatenverwaltungAntworten: 8Letzter Beitrag: 16.10.08, 09:53 -
VB.net 2005 Datenbank zu Laufzeit erstellen!
Von Pageman2 im Forum .NET DatenverwaltungAntworten: 19Letzter Beitrag: 07.10.06, 00:20 -
Datenbank zur Laufzeit erstellen?
Von billyblue im Forum .NET ArchivAntworten: 1Letzter Beitrag: 19.03.04, 15:08





Zitieren
Login




