C# 在一次快照中将多个空行添加到datatable(sql插入数据的速度如何快于循环)

C# 在一次快照中将多个空行添加到datatable(sql插入数据的速度如何快于循环),c#,asp.net,vb.net,datatable,C#,Asp.net,Vb.net,Datatable,如何在datatable中添加多个空行?我的情况是这样的。我有一个sql查询,它生成了一个数据集。它有4个表要连接,大约100000行要显示。在向用户显示结果时,我需要有条件地将一些字段嵌入到数据表中。所以我用我所需的字段创建一个新的datatable,循环第一个字段,在第二个字段创建新行。我正在使用它作为网格的数据源。 但我可以看到sql运行其查询并使resultset比我的循环(它在RAM中处理查询和创建行)更快,比我的简单循环(仅创建行)快得多。为什么是这样?如何提高我的速度?我怀疑情况正

如何在datatable中添加多个空行?我的情况是这样的。我有一个sql查询,它生成了一个数据集。它有4个表要连接,大约100000行要显示。在向用户显示结果时,我需要有条件地将一些字段嵌入到数据表中。所以我用我所需的字段创建一个新的datatable,循环第一个字段,在第二个字段创建新行。我正在使用它作为网格的数据源。 但我可以看到sql运行其查询并使resultset比我的循环(它在RAM中处理查询和创建行)更快,比我的简单循环(仅创建行)快得多。为什么是这样?如何提高我的速度?我怀疑情况正在检查,所以我将其移除。但我还是得到了同样的结果

示例代码 这个问题太大了,如果我分享的话,这是违反公司政策的。所以我将展示代码的一些部分来解释这种情况

select ItemCode,Sku from tblStock ts join tblItemGroup im on ts.ItemCode=im.ItemCode
正在使用数据集dsItems

创建表dtGridItems

然后像这样填充数据表

foreach (DataRow drItem in dsItems.Tables[0].Rows)

{

 DataRow drGridItem = dtGridItems.NewRow();

if(drGridItem["ItemCode"]=="SHIRTS"){

drGridItem["ImgPath"] = Shirts path;

}else if(drGridItem["ItemCode"]=="Pants"){

drGridItem["ImgPath"] = Pants path;

}

drGridItem["ItemCode"] = drItem["ItemCode"];

drGridItem["sku"] = drItem["sku"];

dtGridItems.Rows.Add(drGridItem);

}
这就是我使用的方式。当然,图片并不是我使用的专栏。但是如果我需要解释实际的代码,我需要解释我们软件的很大一部分。那么只有我能解释为什么会有这样的要求

第二次编辑-----

因为问题还不清楚


对不起,我的问题不清楚。我不想把一张表复制到另一张表。我正在尝试将表提取到.net中的数据集。我的问题不是sql server的效率。我的问题是,数据表(在.net中)填充如何比手动填充数据集更快。是否有一种方法可以一次在datatable中创建“n”行并按循环填充它们?我可以在datarow的一次快照中设置多个列数据吗?

将多个行从另一个表插入到一个表中的快速SQL唯一方法类似于

SELECT Field1, Field2, Field3
INTO Table2(Field1, Field2, Field3)
FROM Table1
WHERE ...
请注意,生成数据的查询可以非常复杂,只需将
添加到表(Field,Field)
行,将结果通过管道传输到表中,而不是返回到客户端

在.Net中使用原始SQL命令执行此操作应该需要相同的执行时间长度(加上将命令发送到服务器并解析响应的琐碎开销)

当然,在客户端手动循环任何内容并对每个项目执行操作的速度会慢得多——现在每行的开销都是相同的

传统上,orm在对数据进行大容量更改方面也非常糟糕,因为它们倾向于检查每个对象的状态,并发出单独的更新语句(与循环中的语句相同,只是每个项目通常有更多的处理)

有一些方法可以减少开销(连接池是一个主要候选方案),但您只是在缓解问题

简言之,如果希望SQL一次性完成所有处理,则需要向其发送一次性完成处理所需的所有信息

编辑 我不知道框架使用的所有优化,但其中一个叫做延迟加载。它在使用数据时填充数据,而不是在定义请求时

简言之,它不是加载所有数据,而是用应该检索的数据的引用填充对象

而不是像

DataSet = //SELECT Firstname, Lastname, Age from Contacts

Firstname = John, Lastname = Smith, Age = 32
Firstname = Mike, Lastname = Jones, Age = 18
等等

它用以下内容填充它们:

Firstname = (SELECT Firstname, Lastname, Age from Contacts)[0].Firstname,
Lastname = (SELECT Firstname, Lastname, Age from Contacts)[0].Lastname,
Age = (SELECT Firstname, Lastname, Age from Contacts)[0].Age
然后,当您实际使用该属性时

String Name = String.format("{0} {1}", Data[0]['Firstname'], Data[0]['Lastname']);
它检索所需的特定值。在上面的例子中,它从不费心从数据库中读取年龄


请看一下
IQueryable
接口,以及它如何用于实现延迟加载。

首先,您无法将SQL查询执行的性能与.NET中的循环进行比较。第二,请提供一些代码,也许我们可以帮助您加快执行速度。我对他们分配内存的方式感兴趣。在我的代码中,我创建了我类型的新dararow对象,并将其添加到datatable中。我将展示一个示例我正在做什么我的朋友你的代码不是很可读,例如“drGridItem”来自哪里?您真的需要创建一个新实例并将其分配给每行的dtGridItems吗?很抱歉,这是一个复制粘贴错误。如果我的问题不清楚,我用代码更正了对不起。我不想把一张表复制到另一张表。我正在尝试将表提取到.net中的数据集。我的问题不是sql server的效率。我的问题是,数据表(在.net中)填充如何比手动填充数据集更快。有没有一种方法可以一次在datatable中创建“n”行并按循环填充它们?我可以在datarow的一次快照中设置多个列数据吗?啊,对不起,我误解了。更新了我的回答谢谢你提供了关于延迟加载的大量信息。我听到了那件事,但我没有试着早点理解。你一句话就能让我明白那件事。非常感谢。嗨。我需要把这个答案标记为有用。但是我没有足够的声誉(15个需求)来做这件事。你应该可以随时接受答案(左边的勾号)。一旦你有了15个代表,如果你想给我多一点代表,你也可以投票。无论如何,很高兴我能帮上忙
String Name = String.format("{0} {1}", Data[0]['Firstname'], Data[0]['Lastname']);