我正在进行大规模的插入/更新操作。
所以我使用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
方法的这两个版本。
问题:一个人的优点和缺点是什么?哪一个更快?
答案 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
,第二个应该至少消耗更少的资源。