110,552
社区成员
发帖
与我相关
我的任务
分享
static void test()
{
DataTable dtTemplate = new DataTable();
dtTemplate.Columns.Add("id", typeof(int));
dtTemplate.Columns.Add("ColumnsA", typeof(string));
dtTemplate.Columns.Add("ColumnsB", typeof(string));
dtTemplate.Columns.Add("ColumnsC", typeof(string));
dtTemplate.Columns.Add("ColumnsD", typeof(string));
dtTemplate.Columns.Add("ColumnsE", typeof(string));
while (true)
{
//1.这里另外用一个 DataTable , 只克隆结构
DataTable dt = dtTemplate.Clone();
for (int j = 0; j < 5000; j++)
{
dt.Rows.Add(new object[] { null, "ColumnsA", "ColumnsB", "ColumnsC", "ColumnsD", "ColumnsE" });
}
BulkToDB(dt, "TEST");
//2.用完就释放
dt.Dispose();
Thread.Sleep(100);
}
}
static bool BulkToDB(DataTable sourceDt, string targetTable)
{
using (SqlConnection conn = new SqlConnection(_strConn))
{
conn.Open();
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn))
{
bulkCopy.DestinationTableName = targetTable;
bulkCopy.BatchSize = 1000; //3.这里改成 1000
try
{
bulkCopy.WriteToServer(sourceDt); //写入数据库注释后内存正常释放
return true;
}
catch
{
return false;
}
}
}
}
这样试试。
另外,如果你的数据源也是数据库的话,可以不用 DataTable , SqlBulkCopy 的数据源用 IDataReader , 根本占不了什么内存。
static void test()
{
DataTable dt = new DataTable();
dt.Columns.Add("id", typeof(int));
dt.Columns.Add("ColumnsA", typeof(string));
dt.Columns.Add("ColumnsB", typeof(string));
dt.Columns.Add("ColumnsC", typeof(string));
dt.Columns.Add("ColumnsD", typeof(string));
dt.Columns.Add("ColumnsE", typeof(string));
while (true)
{
for (int j = 0; j < 5000; j++)
{
dt.Rows.Add(new object[] { null, "ColumnsA", "ColumnsB", "ColumnsC", "ColumnsD", "ColumnsE" });
}
BulkToDB(dt, "TEST");
dt.Rows.Clear();
Thread.Sleep(100);
}
}
static bool BulkToDB(DataTable sourceDt, string targetTable)
{
using (SqlConnection conn = new SqlConnection(_strConn))
{
conn.Open();
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn))
{
bulkCopy.DestinationTableName = targetTable;
bulkCopy.BatchSize = sourceDt.Rows.Count;
try
{
bulkCopy.WriteToServer(sourceDt); //写入数据库注释后内存正常释放
return true;
}
catch
{
return false;
}
}
}
}