我们在C#中使用SqlBulk Copy类.在sql中插入批量数据.我们有一张表,里面有1000万条记录.
我们在循环中以10,000个批量插入数据
我们正面临物理内存问题.内存增加而且不会减少.
以下是我们的代码.我们如何在使用sql批量复制时释放内存,或者是否有其他方法可以进行批量插入.
using (System.Data.SqlClient.SqlBulkCopy bulkCopy = new System.Data.SqlClient.SqlBulkCopy(SQlConn,SqlBulkCopyOptions.TableLock,null))
{
//bulkCopy = new System.Data.SqlClient.SqlBulkCopy(SQlConn);
bulkCopy.DestinationTableName = DestinationTable;
bulkCopy.BulkCopyTimeout = 0;
bulkCopy.BatchSize = dt1.Rows.Count;
Logger.Log("DATATABLE FINAL :" + dt1.Rows.Count.ToString(), Logger.LogType.Info);
if (SQlConn.State == ConnectionState.Closed || SQlConn.State == ConnectionState.Broken)
SQlConn.Open();
bulkCopy.WriteToServer(dt1); //DataTable
SQlConn.Close();
SQlConn.Dispose();
bulkCopy.Close();
if (bulkCopy != null)
{
((IDisposable)bulkCopy).Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
这里更新完整的代码.
try
{
using (SqlConnection SQlConn = new SqlConnection(Common.SQLConnectionString))
{
DataTable dt1 = FillEmptyDateFields(dtDestination);
//SqlTableCreator ObjTbl = new SqlTableCreator(SQlConn);
//ObjTbl.DestinationTableName = DestinationTable;
using (System.Data.SqlClient.SqlBulkCopy bulkCopy = new …Run Code Online (Sandbox Code Playgroud) 这是我的代码,它给了我CA2000"new DataTable()..."和"new DataColumn()..."
usersDS.Tables.Add(new DataTable()
{
TableName = "Users",
Columns = { new DataColumn() { ColumnName = "Handle", DataType = typeof(string) }, new DataColumn() { ColumnName = "Nickname" ,DataType = typeof(string) } }
});
Run Code Online (Sandbox Code Playgroud)
是否可以在不声明变量的情况下进行修复?
我再次运行静态分析检查,我得到了100多个唠叨
Label foo = new Label(); //Where this is an ASP.NET web forms label
Run Code Online (Sandbox Code Playgroud)
我是否需要在这些网络表单标签上调用dispose?另外,页面生命周期的后期是否可以安全地调用Dispose?如果一个类实现了IDisposable,但实际上没有做任何事情,那么不调用dispose有什么危害吗?
(是的,我已经读过关闭连接是一件好事,使用块也是一件好事.)
DataSet是另一个似乎因为莫名其妙的原因而实现IDisposable的类.
我想知道为什么在创建一个非常简单的DataTable然后将其设置为null后,垃圾收集不会清除该DataTable使用的所有内存.这是一个例子.变量Before应该等于Removed但它不是.
{
long Before = 0, After = 0, Removed = 0, Collected = 0;
Before = GC.GetTotalMemory(true);
DataTable dt = GetSomeDataTableFromSql();
After = GC.GetTotalMemory(true);
dt = null;
Removed = GC.GetTotalMemory(true);
GC.Collect();
Collected = GC.GetTotalMemory(true);
}
Run Code Online (Sandbox Code Playgroud)
给出以下结果.
Before = 388116
After = 731248
Removed = 530176
Collected = 530176
Run Code Online (Sandbox Code Playgroud) 在App.xaml.cs我的通用应用程序中,我打开了一个SQLConnection.我没有关闭连接.到目前为止它并没有给我带来麻烦.但这是正确的方式吗,我们可以这样离开吗?
如果我们要关闭连接(Dispose()因为我没有看到关闭函数)我们在哪里关闭?在App_Closing?
编辑
这就是我在App.xaml.cs中打开连接的方式
public static SQLiteConnection conn;
public void LoadDatabase()
{
conn = new SQLiteConnection( "JusWriteDB.db");
string sql = @"CREATE TABLE IF NOT EXISTS Folder (FolderCompletedStatus INTEGER, FolderPriority INTEGER, PenColor INTEGER, FolderText TEXT, FolderUUID TEXT PRIMARY KEY NOT NULL );";
using (var statement = conn.Prepare(sql))
{
try
{
statement.Step();
}
catch(Exception)
{
}
}
}
Run Code Online (Sandbox Code Playgroud)
而且(在某些其他文件中)我需要访问此连接,更新表或插入.我通过App.xaml.cs中定义的公共变量访问它
var db = App.conn;
string sql = "SELECT * from Folder Where FolderSyncStatus = 'Del'; ";
try …Run Code Online (Sandbox Code Playgroud) c# ×4
.net ×1
analysis ×1
asp.net ×1
ca2000 ×1
datatable ×1
idisposable ×1
memory ×1
optimization ×1
sql ×1
sql-server ×1
sqlite ×1