1

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

示例代码

查询是如此之大,如果我分享它违反公司政策。所以我将展示代码的一些部分来解释情况

select ItemCode,Sku from tblStock ts join tblItemGroup im on ts.ItemCode=im.ItemCode

正在进入数据集 dsItems

创建表 dtGridItems

dtGridItems = new DataTable();
 dtGridItems.Columns.Add("ImgPath", typeof(String));

 dtGridItems.Columns.Add("ItemCode", typeof(String));
 dtGridItems.Columns.Add("sku", typeof(Long));

然后像这样填充该数据表

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);

}

这就是我使用的方式。当然 image 不是我使用的列。但如果我需要解释实际代码,我需要解释我们软件的很大一部分。然后只有我可以解释为什么要求来到这里。

第二次编辑-----

由于问题还不清楚

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

4

1 回答 1

0

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

SELECT Field1, Field2, Field3
INTO Table2(Field1, Field2, Field3)
FROM Table1
WHERE ...

请注意,生成数据的查询可以像您喜欢的那样复杂,您只需添加INTO Table(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

ETC...

它用以下内容填充它们:

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接口以及它是如何用于实现延迟加载的。

于 2013-07-08T14:16:30.210 回答