3

在此链接上,我找到了新的快速(比Rows.Add())实现,用于将数据添加到新的DataTable(或在列表中我认为是这样的......(:在那里一分钟)

我记得读过ImportRow()最快的地方,尽管似乎以这种方式使用 ImportRow 不会更新表格行,是这样DataTable.Clone()吗?

实现从自定义数据循环加载到表中的多行的最佳方法是什么?

var returnedDtFromLocalDbV11 =  DtFromDb(strConnName, queryStr, strReturnedDtName);
NewDtForIns = returnedDtFromLocalDbV11.Clone();
Stopwatch SwSqlMdfLocalDb11 = new Stopwatch();
SwSqlMdfLocalDb11.Start();
NewDtForIns.BeginLoadData();

for (int i = 0; i < 1000000; i++)
{
   var Dr = NewDtForIns.NewRow();
   Dr[tblClients.LastName] = string.Concat(i, "_"+lastNameStr);
   Dr[tblClients.FirstName] = string.Concat(i,  "_" +firstNameStr);
   //NewDtForIns.Rows.Add(Dr) ;
   //NewDtForIns.ImportRow(Dr) ;
   NewDtForIns.LoadDataRow(new object[] { null, "NewShipperCompanyName", "NewShipperPhone" }, false);
}

 NewDtForIns.EndLoadData();
 DBRCL_SET.UpdateDBWithNewDtUsingSQLBulkCopy(NewDtForIns, tblClients._TblName);
 SwSqlMdfLocalDb11.Stop();
 var ResSqlMdfLocalDbv11_0 = SwSqlMdfLocalDb11.ElapsedMilliseconds;

更新

原来它更快!我的错误是我忘记注释在测试示例时需要时间生成的 3 行数据行LoadDataRow()

   //var Dr = NewDtForIns.NewRow();
   //Dr[tblClients.LastName] = string.Concat(i, "_"+lastNameStr);
   //Dr[tblClients.FirstName] = string.Concat(i,  "_" +firstNameStr);

现在我的配置中的测试结果是:

Rows.Add()        => ~6700ms
LoadDataRow()     => ~5200ms - 5500ms

这很好,但我希望通过更多的性能差异ImportRow()

有什么建议么 ?

4

1 回答 1

1

正如@Magnus 所建议的那样,这是用新的 Rows 填充 DataTable 的更快方法,既漂亮又简单,代码行更少

Stopwatch SwSqlMdfLocalDb11 = new Stopwatch();
SwSqlMdfLocalDb11.Start();
NewDtForIns.BeginLoadData();

for (int i = 0; i < 1000000; i++)
{
   NewDtForIns.LoadDataRow(new object[] { null, "NewShipperCompanyName", "NewShipperPhone" }, false);
}

 NewDtForIns.EndLoadData();
 DBRCL_SET.UpdateDBWithNewDtUsingSQLBulkCopy(NewDtForIns, tblClients._TblName);
 SwSqlMdfLocalDb11.Stop();

如果有的话,我会很高兴学习一种新方法,尽管这对我来说已经是一些新闻了……谢谢。

于 2013-06-15T12:59:48.457 回答