TDM Geschrieben 7. Januar 2008 Teilen Geschrieben 7. Januar 2008 Tag, ich greife mit einer Funktion auf Datensätze innerhalb einer Tabelle zu und möchte Fremdschlüssel aktualisieren (da es beim Einfügen der DS momentan fehler entstehen und er falsche Werte integriert). Tabelle A ist meine Haupttabelle, welche auf Tabelle B verweist. Außerdem gibt es für jeden Typ in Tabelle A noch einen Haupttyp, welche in Tabelle C stehen. Tabelle B verweißt auch auf Tabelle C. Damit nun die richtige ID zu B in A steht, hab ich eine Funktion geschrieben, die erst alle Haupttypen (Tabelle C) iteriert und dann B durchläuft. Danach schaut er in A, und sucht den Typ mit der jeweiligen Beschreibung von B, folglich wird dann A der richtige FK zugewiesen. Soweit funktioniert das Ganze auch wie es soll, nur wird nach beenden der Funktion der Speicher nicht freigegeben und bei der Anzahl der Datensätze beläuft sich das mitunter auf 500 MB (!!!). Hier mal der Code: public int updateRange() { int ret = 0; DbReader reader = new DbReader("C:\\test.mdb", ""); DataTable dtMT = reader.readDataSet("SELECT NAME FROM HitMainTypes").Tables[0]; DataTable dtLR = reader.readDataSet("SELECT NAME FROM LoadRanges").Tables[0]; string[] aMTs = new string[dtMT.Rows.Count]; string[] aLRs = new string[dtLR.Rows.Count]; for (int i = 0; i < dtMT.Rows.Count; i++) { aMTs[i] = (string)dtMT.Rows[i]["Name"]; } for (int i = 0; i < dtLR.Rows.Count; i++) { aLRs[i] = (string)dtLR.Rows[i]["Name"]; } for (int i = 0; i < dtMT.Rows.Count; i++) { for (int j = 0; j < dtLR.Rows.Count; j++) { int mtId = reader.readID("HitMainTypes", "Name=\'" + aMTs[i] + "\'"); Console.WriteLine("ID.{0}={1}", aMTs[i], mtId); //Assert.AreNotEqual(0, mtId, "updateRange.MT"); int lrId = reader.readID("LoadRanges", "(Name=\'" + aLRs[j] + "\') AND HitMainTypeID = " + mtId + ""); Console.WriteLine("ID.{0}={1}", aLRs[j], lrId); if(lrId != 0 && mtId != 0) { int testerle = reader.readDataSet( "SELECT LoadCarryingCapacity.ID" + " FROM LoadCarryingCapacity INNER JOIN LoadRanges ON LoadCarryingCapacity.LoadRangeID = LoadRanges.ID" + " WHERE (LoadRanges.Name = \'" + aLRs[j] + "\') AND (LoadCarryingCapacity.HitMainTypeID = " + mtId + ")").Tables.Count; DataTable dtUpdateId = reader.readDataSet( "SELECT LoadCarryingCapacity.ID" + " FROM LoadCarryingCapacity INNER JOIN LoadRanges ON LoadCarryingCapacity.LoadRangeID = LoadRanges.ID" + " WHERE (LoadRanges.Name = \'" + aLRs[j] + "\') AND (LoadCarryingCapacity.HitMainTypeID = " + mtId + ")").Tables[0]; int[] aUIDs = new int[dtUpdateId.Rows.Count]; for (int k = 0; k < dtUpdateId.Rows.Count; k++) { aUIDs[k] = (int)dtUpdateId.Rows[k]["ID"]; } string where = ""; for (int k = 0; k < dtUpdateId.Rows.Count; k++) { where += "(ID = " + aUIDs[k] + ")"; if (k + 1 < dtUpdateId.Rows.Count) where += " OR "; } string sql = "UPDATE LoadCarryingCapacity" + " SET LoadRangeID = " + lrId + " WHERE " + where; ret += reader.execute(sql); } } } return ret; } Wieso benötigt er auch nach der Funktion (ja, sogar nach dem Schließen des Programms) immernoch so viel Speicher?! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Argbeil Geschrieben 8. Januar 2008 Teilen Geschrieben 8. Januar 2008 Hi. Das mit dem schließen des Programms kann ich nicht nachvollziehen, wird der Prozess nicht beendet? Das nach dem Aufruf noch soviel Speicher belegt wird ist normales GarbageCollector Verhalten. Sobald der Speicher vom OS oder von deiner Applikation benötigt werden sollte wird er automatisch freigegeben, ansonsten bleibt er eben solange belegt und frisst ja kein Brot. Wenn du ein GC.Collect(); GC.WaitForPendingFinalizers(); nach beenden der Methode aufrufst wird der Speicher evtl. sofort freigegeben. Allerdings sollte man das nicht machen. Generell funktioniert das System ganz gut, solange du keine Probleme damit hast würde ich mir auch keine Sorgen darum machen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.