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