C# 插入一百万个带“的对象”;加上「;上榜很慢
当记录最多20万条时,我没有问题,但当记录超过100万条时,将数据输入名为“列表”的列表需要很长时间。(我等了30分钟,仍然没有完成插入列表) 这有什么错? 有没有办法返回一份记录超过100万条的列表或安排 注意:返回列表,然后在excel中浏览并下载该列表(我没有附加代码,因为它停留在我解释的点上)C# 插入一百万个带“的对象”;加上「;上榜很慢,c#,sql-server,ado.net,C#,Sql Server,Ado.net,当记录最多20万条时,我没有问题,但当记录超过100万条时,将数据输入名为“列表”的列表需要很长时间。(我等了30分钟,仍然没有完成插入列表) 这有什么错? 有没有办法返回一份记录超过100万条的列表或安排 注意:返回列表,然后在excel中浏览并下载该列表(我没有附加代码,因为它停留在我解释的点上) var list=newlist(); 使用(SqlCommand-SqlCommand=newsqlcommand(“这里是过程”,sqlConnection)) { sqlCommand.Co
var list=newlist();
使用(SqlCommand-SqlCommand=newsqlcommand(“这里是过程”,sqlConnection))
{
sqlCommand.CommandType=CommandType.StoredProcess;
添加(新的SqlParameter(“@Field_1”,dataInput_field1);
sqlCommand.CommandTimeout=0;
使用(SqlDataReader SqlDataReader=sqlCommand.ExecuteReader())
{
while(sqlDataReader.Read())
{
添加(新的数据类){
response_1=sqlDataReader[“Nombre”].ToString(),
response_2=sqlDataReader[“correlativo_sgrc”].ToString(),
response_3=sqlDataReader[“rut”].ToString(),
response_4=sqlDataReader[“Celular”].ToString(),
response_5=sqlDataReader[“fecha_envio”].ToString(),
response_6=sqlDataReader[“hora_envio”].ToString(),
response_7=sqlDataReader[“mensaje”].ToString()
});
}
}
};
编辑:我解释流程:
void Main()
{
Microsoft.Office.Interop.Excel.Application xl = new Microsoft.Office.Interop.Excel.Application();
var workbook = xl.Workbooks.Add();
xl.Visible = true;
Worksheet sht = ((Worksheet)workbook.ActiveSheet);
Range target = (Range)sht.Range["A1"];
string strCon = @"ODBC;Driver={SQL Server Native Client 11.0};Server=.\SQLExpress;Database=Test;Trusted_Connection=yes";
string strSQL = "select * from MyTable";
var qt = sht.QueryTables.Add(strCon, target, strSQL);
qt.Refresh();
}
这样的代码在我的系统上运行了2秒钟,在Excel中它开始获取外部数据,在20秒钟内完成了100万行
(请始终记住excel不是一个数据库)
编辑:由于T.S.声称这是一种糟糕的方法,并建议使用ACE.OLEDB插入,我花时间测试了一些方法(尽管我已经从经验中知道了,但我已经准备好接受纠正)
本部分讨论了从SQL server获取Excel数据的3种方法。我在这些测试中使用了来自SQL server的相同数据,每次都选择相同的100万行
想想看。你想在一个列表中有一百万条记录,有什么特别的原因吗?与其将数据添加到列表中,不如将数据添加到列表中(这非常快,问题在于读取,而不是添加项目),您可以使用
yield return new DataClass…
将结果流式返回给调用者,如果您知道您将拥有一个非常大的列表,并以大致正确的大小(或更大)创建它将停止大量的重新分配/块复制。但是…1M应该可以正常工作…我经常使用10M行缓冲区,没有问题。但是,为了避免GC伤害我,我使用readonly struct
当我这样做时…@jdwengSqlBulkCopy
用于将数据放入数据库,而不是将其取出,顺便说一句,如果您只使用list来填充te excel-您不需要它。您可以直接从reader转到excel。如果您使用microsoft.ace.ole db Driver,您可以使用excel作为常规数据表谢谢您的回答。我更改了数据类型,如(myfield=(string)sqlDataReader[“data”]),但仍然是相同的。我的问题在代码中,特别是在while循环(while)中(sqlDataReader.Read()),永远不会完成。但是…记录少于50万条,效果很好。我不使用类似excel的数据库,我使用存储过程获取数据,然后将数据保存到列表中,最后使用excel工作表类将数据使用到excel中file@GedwardRomo,如果您的问题确实存在于该代码中,那么您的服务器中有问题我说,我在12秒内填写了500万行列表。你也没有给出数据类的定义。糟糕Approach@T.S.什么是坏方法?在这个项目中使用Microsoft.Office.Interop.Excel.Application
是坏方法
void Main()
{
Microsoft.Office.Interop.Excel.Application xl = new Microsoft.Office.Interop.Excel.Application();
var workbook = xl.Workbooks.Add();
xl.Visible = true;
Worksheet sht = ((Worksheet)workbook.ActiveSheet);
Range target = (Range)sht.Range["A1"];
string strCon = @"ODBC;Driver={SQL Server Native Client 11.0};Server=.\SQLExpress;Database=Test;Trusted_Connection=yes";
string strSQL = "select * from MyTable";
var qt = sht.QueryTables.Add(strCon, target, strSQL);
qt.Refresh();
}