C#/MSSQL - Datensätze in Tabelle begrenzen; mit DataSet?



  • Hallo zusammen.

    Ich habe eine relativ kleine DB mit auch nur einer Tabelle drin. Den
    Inhalt der Tabelle möchte ich relativ klein halten, da immer nur die
    neuesten Daten wichtig sind und nach "kurzer" Zeit gelöscht werden
    können/sollen. Klein halten möchte ich die DB aus Performance- und
    Platzgründen.

    Ich habe es bereits mit dem SqlDataAdapter & DataSet probiert, jedoch
    bleiben immerwieder alle Datensätze in der DB.

    Der Adapter holt sich alle Datensätze aus der Tabelle und füllt das
    Dataset, dann entferne ich aus dem DataSet die überflüssigen Daten,
    füge die neuen hinzu und dann führt der Adapter das Update aus.

    Ist wahrscheinlich nicht die richtige herangehensweise (dachte mir, so
    dürfte es am schnellsten gehen, soll ja auch performant sein), aber
    wie kann ich mein Vorhaben realisieren?

    Gruß
    gigi`



  • Führt er nur ein Update aus, oder auch Delete und Insert?



  • Du meinst wahrscheinlich den Adapter, also so hab ich es:

    SqlDataAdapter mySqlDataAdapter = new SqlDataAdapter("SELECT * FROM MeineTabelle", mySqlConnection);
    
    Dann setze ich den InsertCommand für den Adapter mit allen Parametern
    
    int db_count = mySqlDataAdapter.Fill(myDataSet, "MeineTabelle");
    
    if (db_count > 250)
    {
      int dsCount = myDataSet.Tables["MeineTabelle"].Rows.Count;
      for (int i = 250; i < dsCount; i++)
      {
        myDataSet.Tables["MeineTabelle"].Rows[i].Delete();
      }
      myDataSet.AcceptChanges();
    }
    
    Dann erstelle ich in einer Schleife der neuen Daten einen InsertString, erstelle ein neues DataRow und füge es dem DataSet hinzu.
    
    Danach: new_db_count = mySqlDataAdapter.Update(myDataSet, "MeineTabelle");
    

    Mehr habe ich nicht, fehlt etwas?



  • Wozu machst Du das nochmal?
    Mach doch eine Trigger.

    Oder du setzt ein Query zum löschen ab welches dir die Daten löscht.
    Bedenke aber: Löschen dauert bei MSSQL sehr lange.
    Du kannst im SQL aber auch einen Task anlegen welcher dir in der Nacht die Daten löscht und vi8elleicht auch gleich verkleinert.
    Der Platz für die Daten wird ja nicht wirklich freigegeben.
    Wenn du aber bereits bei Datensätzen um 250 probleme bekommst dann sollte Du etwas am Design verändern.
    Ich habe hier Datenbanken welche 10GB groß sind und da kommen die Daten im ms-Bereich.



  • Unix-Tom schrieb:

    Wozu machst Du das nochmal?
    Mach doch eine Trigger.

    Kenn ich mich leider nicht mit aus *g*.

    Unix-Tom schrieb:

    Wozu machst Du das nochmal?
    Oder du setzt ein Query zum löschen ab welches dir die Daten löscht.
    Bedenke aber: Löschen dauert bei MSSQL sehr lange.
    Du kannst im SQL aber auch einen Task anlegen welcher dir in der Nacht die Daten löscht und vi8elleicht auch gleich verkleinert.
    Der Platz für die Daten wird ja nicht wirklich freigegeben.
    Wenn du aber bereits bei Datensätzen um 250 probleme bekommst dann sollte Du etwas am Design verändern.
    Ich habe hier Datenbanken welche 10GB groß sind und da kommen die Daten im ms-Bereich.

    Die Tasks kenne ich auch noch garnicht, vll find ich was im Netz darüber. Und ich habe nie gesagt, dass ich Probleme bekomme. Nur Fakt ist, die Abfrage auf eine DB mit 250 Datensätzen ist schneller als eine mit 20000 Datensätzen. Selbst wenns minimal ist, es muss schnell gehen. Das mit dem Platz ist mir auch klar, komprimieren kann ich selber ab und an.

    Ich möchte auch nicht unbedingt darüber philosophieren warum und weshalb ich es tue. Will einfach nur das es klappt 🙂



  • Ich frage mich, warum du dann überhaupt (bei 250 Datensätzen) eine Datenbank benutzt?



  • Warum muss ich hier unbedingt meine Vorhaben rechtfertigen. Es gibt etwas, was ich so und so machen will, es allein nicht hinbekomme und um Hilfe bitte. Alles andere ist Nebensache.



  • Es geht hier aber auch darum von erfahrerenen zu lernen wie man es vielleicht besser machen kann.



  • Ich gebs auf. Danke für eure Hilfe.



  • gigi` schrieb:

    Warum muss ich hier unbedingt meine Vorhaben rechtfertigen. Es gibt etwas, was ich so und so machen will, es allein nicht hinbekomme und um Hilfe bitte. Alles andere ist Nebensache.

    Es geht nicht um Rechtfertigung sondern um die Hintergründe. Es führen viele Wege nach Rom. Und wenn Du den falschen genannt bekommst, wirst Du noch mehr heulen als jetzt.

    myDataSet.AcceptChanges();

    ist an der Stelle falsch. Mit AcceptChanges hat der DataAdapter keinen Hinweis mehr, was er ändern soll da der aktuelle Stand zum "Originalstand" gemacht wird. Du musst nach Deinen Löschaktionen schon Update des Adapters aufrufen.

    [edit]
    Warum man bei 256 Datensätzen eine Datenbank benutzt kann der gleiche Grund sein, warum man es bei 10.000 Datensätzen macht. Der Datenbank wegen oder weil zu erwarten ist, das die Anzahl der Datensätze einmal steigen wird.

    Oder als Gegenfrage:
    Warum keine Datenbank verwenden wenn es 256 Datensätze sind ?
    [/edit]



  • gigi` schrieb:

    Ich gebs auf. Danke für eure Hilfe.

    Meinst du den das deine Aussage konstruktiv ist wenn du hilfe suchst.

    Ein wenig mehr freundlichkeit wäre schon passender oder meinst du nicht.
    👎



  • Knuddlbaer schrieb:

    myDataSet.AcceptChanges();

    ist an der Stelle falsch. Mit AcceptChanges hat der DataAdapter keinen Hinweis mehr, was er ändern soll da der aktuelle Stand zum "Originalstand" gemacht wird. Du musst nach Deinen Löschaktionen schon Update des Adapters aufrufen.

    Aso, also direkt nach dem Delete() Aufruf. Werde es korrigieren.

    Unix-Tom schrieb:

    Meinst du den das deine Aussage konstruktiv ist wenn du hilfe suchst.

    Ein wenig mehr freundlichkeit wäre schon passender oder meinst du nicht.
    👎

    Nein, selbstverständlich nicht. Aber mein Problem ist folgendes. Ich habe ein DataSet, dass nicht richtig in der DB gespeichert wird. Mehr nicht.

    Stell dir vor ich muss in jedem einzelnen Forum immerwieder Fragen zu meinem Vorhaben beantworten. Ich weiß schon ganz genau warum ich das so machen will, Problem ist nur, ich weiß nicht wie und deshalb bin ich hier.

    Gruß
    Sebastian



  • Es reicht wenn Du das Update nach der Schleife aufrufst, aber es muss vor dem AcceptChanges aufgerufen werden.

    Nach Sie sichergestellt haben, dass die Änderungen an den Daten in einer DataTable korrekt sind, können Sie die Änderungen mithilfe der AcceptChanges-Methode der DataRow, der DataTable oder des DataSet übernehmen. Dadurch werden die Current-Zeilenwerte auf Original-Werte festgelegt, und die RowState-Eigenschaft wird auf Unchanged festgelegt

    Und was unchanged ist, wandert nicht in die Datenbank.



  • Hat leider auch nicht geholfen.

    Ich hab auch mal das Programm etwas umgeschrieben und fülle die Daten per BindingSource in ein DataGridView. Wenn ich dort eins entferne und das Update ausführe, ist es auch wirklich weg. Anscheinend liegts am Aufruf von Delete() für die Rows im DataSet. Merkwürdig ist aber auch, dass ich mir an verschiedenen Stellen Counter ausgeben lasse, die die Rows im DataSet zählen. Dort wird alles richtig angegeben. Am Anfang habe ich ganz viele (mittlererweile), nach dem Delete() habe ich 250 und nach dem Hinzufügen der neuen Daten 250 + x. Keine Ahnung warum dann das Update nicht klappt.

    Gruß
    Sebastian



  • Update liefert Dir die Anzahl der Datensätze, die durch das Update behandelt wurden. Prüfe mal diesen Wert.

    Wird eine Exception geworfen ?

    Zeig mal bitte den Code, der das Update ausführt.



  • Was mir das Update() zurückliefert weiß ich, deshalb hab ichs ja auch genannt, der ist ja auch richtig. Exceptions werden keine geworfen:

    new_count = mySqlDataAdapter.Update(myDataSet, "MeineTabelle");

    Edit:

    Ich bin gerade sogar schon soweit, dass ich probiere mir ein 2. leeres DataSet, mit derselben Tabelle zu erzeugen, wo ich dann meine 250 + x Daten reinknalle. Mal gucken was das bringt. Irgendwo muss doch der Bock sein.



  • Nochmals einer von vielen Ansätzen aber eben IMHO ein richtiger.

    Wenn deine DB Trigger unterstützt dann mache eine Trigger beim einfügen eines Datensatzes.
    Wenn die Anzahl datensätze größer 250 dann lösche durch den Trigger einen Raus.

    Wenn du MySQL verwendest dann gibt es die Möglichkeit nur 250 Datensätze zu laden.

    SELECT * FROM bla LIMIT 250

    Bei MSSQL ist es z.B.
    SELECT TOP 250 * FROM bla

    u.s.w.
    Trigger ist der beste Ansatz dafür um nur 250 ROWS zu haben.
    Wenn dein RDBMS keine Trigger kann dann kannst Du bei den INSERTS ansätzen.
    Da kannst Du vorher ein DELETE machen.
    Bei MySQL kann man den DELETE sogar begrenzen mit LIMIT.
    Hier musst du dafür sorgen das duch eine WHERE die richtigen gelöscht werden.
    Eine DELETE ist jedenfalls besser als durch NET die Datensätze zu löschen welche zu viel sind.



  • Hi.

    Also meine DB unterstützt Trigger, aber habe noch nie damit zu tun gehabt, muss ich mal ins schlaue MSSQL Buch schauen.

    Mittlererweile hab ich es eben geschafft alles so zum Laufen zu bringen wie ich es geplant habe. Ich hatte noch Code-Fragmente in der Methode die gestört haben, als ich alles noch mit den Execute-Befehlen gemacht habe. Das hat wohl gestört.

    Außerdem bekam ich den Tipp, das AcceptChanges zu entfernen, da das vor dem Update stört und beim Update automatisch aufgerufen wird.

    Vielen Dank an alle, nun binsch glücklich.

    Gruß
    gigi`


Anmelden zum Antworten