Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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# 数据表Unpivot非常慢。还有别的选择吗?_C#_Sql Server_Excel_Entity Framework_Datatable - Fatal编程技术网

C# 数据表Unpivot非常慢。还有别的选择吗?

C# 数据表Unpivot非常慢。还有别的选择吗?,c#,sql-server,excel,entity-framework,datatable,C#,Sql Server,Excel,Entity Framework,Datatable,我有一个excel工作表,大约有200行和200多列。我需要取消打印此excel工作表并将其插入sql server表中。我使用的是第三方excel api,它将excel工作表转换为ADO.Net数据表 原始数据表A 对于Unpivot操作,我遍历原始数据表的行和列,并将值分配给另一个根据 数据表B未激活 在填充新的DataTable之后,我将对DataTable使用SQlBulkCopy(),并将所有记录保存到SQLServer表中 我用于Un Pivot操作的代码 //excelExp

我有一个excel工作表,大约有200行和200多列。我需要取消打印此excel工作表并将其插入sql server表中。我使用的是第三方excel api,它将excel工作表转换为ADO.Net数据表

原始数据表A

对于Unpivot操作,我遍历原始数据表的行和列,并将值分配给另一个根据

数据表B未激活

在填充新的DataTable之后,我将对DataTable使用SQlBulkCopy(),并将所有记录保存到SQLServer表中

我用于Un Pivot操作的代码

//excelExport is the DataTable which stores the entire excel workSheet

DataTable newDatatable = new DataTable();   //For Un-Pivoting
newDatatable .Columns.Add(new DataColumn("EconomyID"));
newDatatable .Columns.Add(new DataColumn("SystemLanguage"));
newDatatable .Columns.Add(new DataColumn("VariableName"));
newDatatable .Columns.Add(new DataColumn("VariableValue"));
foreach (DataRow dr in excelExport.Rows)     //excelExport is the original datatable      
{
int colCount = 0;
       foreach (DataColumn dc in excelExport.Columns)
       {                    
          if (colCount >= 2)
          {
           DataRow dr2 = newDatatable.NewRow();                                           
           dr2["Economy"] = dr[1].ToString();
           dr2["SystemLanguageID"] = dr[2].ToString();
           dr2["VariableName"] = dc.ColumnName;
           dr2["VariableValue"] = dr[dc].ToString();
           newDatatable.Rows.Add(dr2);
          }
         colCount++;
       }
 } 
现在的问题是因为我原来的Datatable A有200多列(和200行)。遍历每一行并将值分配给另一个newDatatable需要10秒。
所以整个操作需要200行*10秒。。。基本上永远(取决于excel/datatable中的列);仅用于创建newDatatable。是否有更有效的方法来处理此Un-pivot操作。我知道我们有为excel到sqlserver导入操作构建的SSIS包,但我们的要求是,客户端应该能够将excel上传到系统中,并且过程必须是实时的。有什么建议吗?

对于200列,按列进行索引查找可能是罪魁祸首。您可以将查找更改为按列编号而不是字符串名称进行:

   foreach (DataColumn dc in excelExport.Columns)
   {                    
      if (colCount >= 2)
      {
       DataRow dr2 = newDatatable.NewRow();                                           
       dr2[0] = dr[1].ToString();
       dr2[1] = dr[2].ToString();
       dr2[2] = dc.ColumnName;
       dr2[3] = dr[colCount].ToString();
       newDatatable.Rows.Add(dr2);
      }
     colCount++;
   }

虽然这只是一个猜测。我会投资一个好的分析工具来测量流程的缓慢之处,并首先修复最慢的部分。

构建一个新的
数据表
比使用廉价的结构(如
Tuple
s)更昂贵

var tuples = new List<Tuple<string, string, string, object>>();
foreach (DataRow dr in excelExport.Rows)
{
    int colCount = 0;
    foreach (DataColumn dc in excelExport.Columns)
    {                    
        if (colCount >= 2)
        {
            tuples.Add(Tuple.Create(dr[1],
                                    dr[2],
                                    dc.ColumnName,
                                    (object)dr[colCount])
                                   );
        }
        colCount++;
    }
}
var tuples=newlist();
foreach(excelExport.Rows中的数据行dr)
{
int colCount=0;
foreach(excelExport.Columns中的数据列dc)
{                    
如果(colCount>=2)
{
tuples.Add(Tuple.Create)(dr[1],
dr[2],,
dc.ColumnName,
(对象)dr[colCount])
);
}
colCount++;
}
}

您还可以跳过
ToString()
调用,因为
Tuple.Create
将使用类型推断来创建正确的Tuple。如果所有值恰好具有相同的数据类型,则最后一项可能具有显式类型(而不是
对象
),否则您需要
(对象)
强制转换。

如果您希望使用VBA在excel端执行此操作,将非常有用。