IDataReader与DataTable;利弊

时间:2015-05-25 14:56:40

标签: c# datatable sqlbulkcopy idatareader

我正在进行大规模的插入/更新操作。

所以我使用SqlBulkCopy

SqlConnection myConnection = new SqlConnection(myConnectionString);

try
{
    myConnection.Open();
    SqlBulkCopy myCommand = new SqlBulkCopy(myConnection);

    myCommand.DestinationTableName = "myDestinationTableName";

    //Below method has four overloads; 
    //of which I am interested in the two mentioned below.
    myCommand.WriteToServer();

    myCommand.Close();
}
finally
{
    myConnection.Close();
}

但我偶然发现了WriteToServer方法的这两个版本。

  1. SqlBulkCopy.WriteToServer Method (IDataReader)

  2. SqlBulkCopy.WriteToServer Method (DataTable)

  3. 问题:一个人的优点和缺点是什么?哪一个更快?

2 个答案:

答案 0 :(得分:2)

在默认情况下,两者都应具有相似的性能,否则horses ..

但是有一个区别,WriteToServer DataTable作为参数将插入来自DataTable的所有行,但是IDataReader副本会从阅读器中的下一个可用行开始(默认情况下将设置为第一行)

请记住,IDataReader提供了只读/转发机制,因此有一个当前位置/行索引的概念,而DataTable则没有这样的东西。每个Read上的IDataReader行索引移动到下一行。

答案 1 :(得分:1)

当您在应用程序中的某个位置已经有合适的 function DFSWithDirectedGraph(v) { Nodes[v].visited = true; reDrawNode(Nodes[v].x, Nodes[v].y, Nodes[v].id, 'blue'); for(var j = 0; j<i; j++) { if(Path[v][j] != undefined && Nodes[j].visited == false) { drawArrow(Nodes[v].x, Nodes[v].y, Nodes[j].x, Nodes[j].y, 'blue', Path[v][j]); DFSWithDirectedGraph(j); if(Path[j][v] != undefined) { drawArrow(Nodes[j].x, Nodes[j].y, Nodes[v].x, Nodes[v].y, 'green', Path[j][v]); } else { drawArrow(Nodes[j].x, Nodes[j].y, Nodes[v].x, Nodes[v].y, 'green', ""); } } } } 时,DataTable的重载适用于这些情况。

反过来,使用DT进行重载是针对这种情况,当存在一些查询时(原始查询文本或构造命令,它并不重要)。在这种情况下,不需要创建中间数据容器,例如IDataReader。因此,此重载允许您直接从读取器获取数据。

假设您既没有DT也没有DT,第二个应该至少消耗更少的资源。