使用
C#
MySql
当向 MySql 表中添加新记录时,RAM 的消耗会增加。
编码
#region *** ЗАПРОС ***
tbl_name = textBox115.Text; // Имя редактируемой таблицы. Пирсваиваем значение переменной
sql_zpr_01 = "SELECT * FROM " + tbl_name; // Строка запроса
#endregion *** ЗАПРОС ***
sqlCom_0 = new MySqlCommand(sql_zpr_01, connMySql_db_2);
sqlCom_0.ExecuteNonQuery();
MySqlDtAdp_0 = new MySqlDataAdapter(sqlCom_0);
#region *** СОЗДАНИЕ ДТ ***
dt_025 = new DataTable();
MySqlDtAdp_0.Fill(dt_025); // -> DataTable
#endregion *** СОЗДАНИЕ ДТ ***
MySqlCommandBuilder commandBuilder = new MySqlCommandBuilder(MySqlDtAdp_0);
int str; // кол. строк в пакете
str = Convert.ToInt32(textBox123.Text); // кол. строк
for (int s = 1; s <= str; s++)
{
name_str = textBox116.Text + "_" + s;
zpch_str = textBox117.Text + "_" + s;
newRow = dt_025.NewRow();
newRow["name"] = name_str;
newRow["zpch"] = zpch_str;
dt_025.Rows.Add(newRow);
}
MySqlDtAdp_0.Update(dt_025);
问题
如何减少消耗的 RAM 量?
我将补充:当使用增加记录时MySqlParameter
不会发生 RAM 消耗。
正如我所见,你
DataTable
的不是全局的 => 当你退出上下文时,它应该被垃圾收集器消耗并清除 RAM。但是,不知道何时会发生这种情况,因为它仅在适当的时候被激活,例如,RAM 即将用完或程序已进入非关键区域。即使调用Dispose
,垃圾收集器也不会立即杀死该对象。添加带有查询句柄的行时,由于未创建庞大
DataTable
的对象(包括大量对象 + 更改跟踪,它允许您存储 3 个(喜欢的)记录状态)这一事实,增加量很小。换句话说,如果 RAM 的成本对你来说很重要,那么最好拒绝使用
DataTable
它并通过参数化查询插入数据。带有参数的查询中 RAM 没有增加的事实可以解释为您正在传递重要类型的变量 => 它们存储在堆栈上,而不是堆上,并且在没有垃圾收集器的情况下立即销毁.
通常,您没有正确解释 destination
DataTable
。可视化少量数据并在服务器上简单更新时更需要它。如果你往里面挤太多,它会膨胀也就不足为奇了。PS 我在评论中得到了纠正。你遇到的问题是你真的在做额外的填充。也就是说,您用数据库表中的所有数据填充表。