Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 插入一百万个带“的对象”;加上「;上榜很慢_C#_Sql Server_Ado.net - Fatal编程技术网

C# 插入一百万个带“的对象”;加上「;上榜很慢

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

当记录最多20万条时,我没有问题,但当记录超过100万条时,将数据输入名为“列表”的列表需要很长时间。(我等了30分钟,仍然没有完成插入列表) 这有什么错? 有没有办法返回一份记录超过100万条的列表或安排

注意:返回列表,然后在excel中浏览并下载该列表(我没有附加代码,因为它停留在我解释的点上)

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()
});
} 
}
};
编辑:我解释流程:

  • 使用数据库中的存储过程(sp)搜索数据
  • 获取sp的数据并保存到列表中(是我粘贴在此处的代码)
  • 返回该列表,并使用它创建一个包含该类的excel文件 Excel工作表(用于下载报告)
  • (这毕竟不适合作为评论和某种回答)

    我刚刚用5000000条记录尝试了你的代码(稍微纠正了拼写错误,而不是使用SQL语句的SP),并在12秒内加载了列表。我铸造了类型(即:MyField=(int)sqlDataReader[“MyField”])。有4个字段(Guid、string、int和decimal)在Phenom II X6 1090T上计时,内存为16Gb,数据库位于7200 RPM 500Gb磁盘上,服务器为SQL Express 2012。瞧,我不认为您的瓶颈是读取数据或填充列表

    你说的是“浏览并下载excel中的列表”。首先填充要加载到excel的列表不仅是不必要的,而且本质上是非常慢的操作。我认为你没有包含的代码中有excel COM调用,而且速度很慢。如果完成了100万次,你保证会一直等待

    将数据获取到excel有多种更快的方法,最快的方法可能是使用excel的查询表。添加方法。即:

    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万行

  • 查询表。添加方法是最快的。经过时间-00:00:29.7767063

  • 使用NuGet的Epplus插入数据。如果您担心的话,不需要安装Excel。与我使用Linq获取数据作为集合的其他两种方法不同,这一种方法比第一种方法慢,但一点也不差。经过时间-00:00:37.7340975

  • 这是这三种方法中最差的一种。使用ACE.OleDb使用T.S提供链接的代码插入数据。正如预期的那样,速度非常慢。它的计时是不可接受的,但无论如何我计时。经过时间-00:11:52.7427790


  • 想想看。

    你想在一个列表中有一百万条记录,有什么特别的原因吗?与其将数据添加到列表中,不如将数据添加到列表中(这非常快,问题在于读取,而不是添加项目),您可以使用
    yield return new DataClass…
    将结果流式返回给调用者,如果您知道您将拥有一个非常大的列表,并以大致正确的大小(或更大)创建它将停止大量的重新分配/块复制。但是…1M应该可以正常工作…我经常使用10M行缓冲区,没有问题。但是,为了避免GC伤害我,我使用
    readonly struct
    当我这样做时…@jdweng
    SqlBulkCopy
    用于将数据放入数据库,而不是将其取出,顺便说一句,如果您只使用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();
    }