2013-08-09 2 views
0

У меня есть абсолютно массовое использование памяти с использованием этого кода. Не могли бы вы рассказать мне, где я ошибаюсь? Я добавляю около 50 тыс. Записей в эту базу данных (я знаю, что это немного больше для SQL Server CE), но это не должно происходить так часто. Любая помощь приветствуется.SQL Server CE - использование больших объемов памяти - массовая установка строк

public static void AddRow(uint id, string name, uint zone, uint map, string state, 
     string type, float x, float y, float z, DataBaseType dbtype) 
    { 
     string db = null; 
     string table = null; 
     DateTime dateTime = DateTime.Now.Date; 
     using (var con = new SqlCeConnection(connStr)) 
     { 
      using (
       var cmd = 
        new SqlCeCommand(
         "INSERT INTO " + table + "(Id, Name, Zone, Map, State, Type, X, Y, Z, Create_Date, Update_Date) " + 
         "VALUES (@Id, @Name, @Zone, @Map, @State, @Type, @X, @Y, @Z, @Create_Date, @Update_Date)", con)) 
      { 
       cmd.CommandType = CommandType.Text; 
       cmd.Parameters.AddWithValue("@Id", id); 
       cmd.Parameters.AddWithValue("@Name", name); 
       cmd.Parameters.AddWithValue("@Zone", zone); 
       cmd.Parameters.AddWithValue("@Map", map); 
       cmd.Parameters.AddWithValue("@State", state); 
       cmd.Parameters.AddWithValue("@Type", type); 
       cmd.Parameters.AddWithValue("@X", x); 
       cmd.Parameters.AddWithValue("@Y", y); 
       cmd.Parameters.AddWithValue("@Z", z); 
       cmd.Parameters.AddWithValue("@Create_Date", dateTime); 
       cmd.Parameters.AddWithValue("@Update_Date", dateTime); 
       con.Open(); 
       try 
       { 
        cmd.ExecuteNonQuery(); 
       } 
       catch (Exception ex) 
       { 
        MessageBox.Show(ex.Message); 
        BotControl.StopBot(); 
       } 
       finally 
       { 
        cmd.Dispose(); 
       } 
      } 
      con.Close(); 
      con.Dispose(); 
     } 
    } 
+0

Как вы _know_ у вас есть утечка памяти? –

+0

Ну, программа, в которой он находится, обычно составляет около 200-300 мг. Когда я запускаю это, он растет экспоненциально. Он превысил 1,5 г памяти, прежде чем я его убил. –

+1

Используйте уже открытое соединение вместо открытия 50k раз – ErikEJ

ответ

1
public static void AddRow(uint id, string name, uint zone, uint map, string state, string type, float x, float y, float z, DataBaseType dbtype) 
{ 
    string db = null; 
    string table = null; 

    DateTime dateTime = DateTime.Now.Date; 
    using (var con = new SqlCeConnection(connStr)) 
    { 
     using (
      var cmd = 
       new SqlCeCommand(
        "INSERT INTO " + table + "(Id, Name, Zone, Map, State, Type, X, Y, Z, Create_Date, Update_Date) " + 
        "VALUES (@Id, @Name, @Zone, @Map, @State, @Type, @X, @Y, @Z, @Create_Date, @Update_Date)", con)) 
     { 
      cmd.CommandType = CommandType.Text; 
      cmd.Parameters.AddWithValue("@Id", id); 
      cmd.Parameters.AddWithValue("@Name", name); 
      cmd.Parameters.AddWithValue("@Zone", zone); 
      cmd.Parameters.AddWithValue("@Map", map); 
      cmd.Parameters.AddWithValue("@State", state); 
      cmd.Parameters.AddWithValue("@Type", type); 
      cmd.Parameters.AddWithValue("@X", x); 
      cmd.Parameters.AddWithValue("@Y", y); 
      cmd.Parameters.AddWithValue("@Z", z); 
      cmd.Parameters.AddWithValue("@Create_Date", dateTime); 
      cmd.Parameters.AddWithValue("@Update_Date", dateTime); 
      con.Open(); 
      try 
      { 
       cmd.ExecuteNonQuery(); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
       BotControl.StopBot(); 
      } 
     } 
     cmd.Parameters.Clear(); 
     cmd.Dispose(); 
     con.Close(); 
     con.Dispose(); 
    } 

}

+0

Добро пожаловать в SO. Хотя ваш ответ может решить проблему, вы должны потратить некоторое время, чтобы объяснить свой ответ. Добавление двух строк в фрагменте кода может не отображаться и не понимать всеми. –