tutorials.de Buch-Aktion 02/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
20
ZUGRIFFE
869
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    xlon xlon ist offline Mitglied Silber
    Registriert seit
    Jun 2009
    Beiträge
    91
    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
     

  2. #2
    Avatar von RudolfG
    RudolfG RudolfG ist offline Mitglied Brokat
    Registriert seit
    Jul 2006
    Ort
    Gummersbach (NRW)
    Beiträge
    336
    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ß
    RudolfG
     
    Technologien
    (Gute) Grundkenntnisse: HTML, CSS
    Fortgeschrittene-Kenntnisse: C++/Qt, C# (WinForms, Webservice), SQL

  3. #3
    xlon xlon ist offline Mitglied Silber
    Registriert seit
    Jun 2009
    Beiträge
    91
    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
     

  4. #4
    xlon xlon ist offline Mitglied Silber
    Registriert seit
    Jun 2009
    Beiträge
    91
    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();
     

  5. #5
    Avatar von RudolfG
    RudolfG RudolfG ist offline Mitglied Brokat
    Registriert seit
    Jul 2006
    Ort
    Gummersbach (NRW)
    Beiträge
    336
    Zitat Zitat von xlon Beitrag anzeigen
    Hallo Rudolf,
    ich habe einen ganz normalen sql server 2005, das sind beides sehr gute vorschläge. nur wie mache ich das?
    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

    Zitat Zitat von xlon Beitrag anzeigen
    wie mache ich eine abfrage ob 1 sekunde nichts gedrückt wurde?
    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.

    Zitat Zitat von xlon Beitrag anzeigen
    und wie kann ich die daten im hintergrund laden lassen
    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

    Zitat Zitat von xlon Beitrag anzeigen
    vielen dank für deine schnelle antwort, ich hoffe du kannst mir noch weiterhelfen
    Gern geschehen, ich hoffe meine Ansätze helfen entweder dir oder regen andere an sich mit Ideen/Vorschlägen zu beteiligen

    Gruß
    RudolfG
     
    Technologien
    (Gute) Grundkenntnisse: HTML, CSS
    Fortgeschrittene-Kenntnisse: C++/Qt, C# (WinForms, Webservice), SQL

  6. #6
    xlon xlon ist offline Mitglied Silber
    Registriert seit
    Jun 2009
    Beiträge
    91
    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
     

  7. #7
    Avatar von VScan
    VScan VScan ist offline Mitglied Gold
    Registriert seit
    Dec 2008
    Ort
    Munich
    Beiträge
    102
    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 VScan
     
    Netiquette (vA §15)
    Codetags/Codeboxen
    Sehr gut gelöste Beiträge bitte mit einem "Danke" abschließen, danke :D

  8. #8
    xlon xlon ist offline Mitglied Silber
    Registriert seit
    Jun 2009
    Beiträge
    91
    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
     

  9. #9
    Avatar von VScan
    VScan VScan ist offline Mitglied Gold
    Registriert seit
    Dec 2008
    Ort
    Munich
    Beiträge
    102
    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.

    MfG
    Geä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

  10. #10
    xlon xlon ist offline Mitglied Silber
    Registriert seit
    Jun 2009
    Beiträge
    91
    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.

    Zitat Zitat von VScan Beitrag anzeigen
    Wenn du Deine Suchalgorythmen mit einer Datenbankabfrage machen kannst, tu das, denn eine Datenbank arbeitet effizienter als dein (oder mein XD) Programm.
    ? versteh ich nicht.
     

  11. #11
    Avatar von VScan
    VScan VScan ist offline Mitglied Gold
    Registriert seit
    Dec 2008
    Ort
    Munich
    Beiträge
    102
    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


    LG
     
    Netiquette (vA §15)
    Codetags/Codeboxen
    Sehr gut gelöste Beiträge bitte mit einem "Danke" abschließen, danke :D

  12. #12
    xlon xlon ist offline Mitglied Silber
    Registriert seit
    Jun 2009
    Beiträge
    91
    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?
     

  13. #13
    Avatar von RudolfG
    RudolfG RudolfG ist offline Mitglied Brokat
    Registriert seit
    Jul 2006
    Ort
    Gummersbach (NRW)
    Beiträge
    336
    Zitat Zitat von xlon Beitrag anzeigen
    ich programmiere ein tool welches problemmeldungen annimmt. 3 mit arbeiter legen problemmeldungen an, dann sollen die aber bei jedem zusehen sein.
    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.

    Zitat Zitat von xlon Beitrag anzeigen
    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?
    Das währe natürlich eine Optimierung, da weniger Daten geladen und verwaltet werden.

    Gruß
    RudolfG
     
    Technologien
    (Gute) Grundkenntnisse: HTML, CSS
    Fortgeschrittene-Kenntnisse: C++/Qt, C# (WinForms, Webservice), SQL

  14. #14
    xlon xlon ist offline Mitglied Silber
    Registriert seit
    Jun 2009
    Beiträge
    91
    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
     

  15. #15
    Avatar von RudolfG
    RudolfG RudolfG ist offline Mitglied Brokat
    Registriert seit
    Jul 2006
    Ort
    Gummersbach (NRW)
    Beiträge
    336
    Zitat Zitat von xlon Beitrag anzeigen
    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.
    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


    Zitat Zitat von xlon Beitrag anzeigen
    ich weiß ja nicht ob ich denn generell einen fehler mache.

    ist es denn richtig das ich jedes mal das hier ausführe:
    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ß
    RudolfG
     
    Technologien
    (Gute) Grundkenntnisse: HTML, CSS
    Fortgeschrittene-Kenntnisse: C++/Qt, C# (WinForms, Webservice), SQL

Ähnliche Themen

  1. Datenverwaltung zur Laufzeit (ohne Datenbank)
    Von Augus im Forum .NET Datenverwaltung
    Antworten: 2
    Letzter Beitrag: 13.12.10, 11:58
  2. C# schlechte Datenbank laufzeit
    Von xlon im Forum .NET Datenverwaltung
    Antworten: 1
    Letzter Beitrag: 20.08.10, 15:05
  3. [VC++] Access Datenbank zur Laufzeit erstellen
    Von warcraft9105 im Forum .NET Datenverwaltung
    Antworten: 8
    Letzter Beitrag: 16.10.08, 09:53
  4. VB.net 2005 Datenbank zu Laufzeit erstellen!
    Von Pageman2 im Forum .NET Datenverwaltung
    Antworten: 19
    Letzter Beitrag: 07.10.06, 00:20
  5. Datenbank zur Laufzeit erstellen?
    Von billyblue im Forum .NET Archiv
    Antworten: 1
    Letzter Beitrag: 19.03.04, 15:08