如何在datatable中添加多个空行?我的情况是这样的 . 我有一个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);
}
这就是我使用的方式 . 当然,图像不是我正在使用的列 . 但如果我需要解释实际代码,我需要解释我们软件的很大一部分 . 然后我才能解释为什么要求来到这里 .
第二次编辑-----
既然问题还不清楚
对不起,如果我的问题不明确 . 我不是想把一张 table 复制到另一张 table . 我正在尝试将表格提取到.net中的数据集 . 我的问题不是sql server的效率 . 我的问题是数据表(在.net)填充如何比我手动填充数据集更快 . 有没有办法在一个镜头中在数据表中创建'n'行并通过循环填充?我可以在datarow中的单个镜头中设置多个列数据吗?
1 回答
快速的SQL-Only方法将多行从一个表中插入另一个表中 .
请注意,生成数据的查询可能非常复杂,只需添加
INTO Table(Field, Field)
行即可将结果输入到表中而不是返回到客户端 .使用原始SQL命令从.Net执行此操作应该花费相同的时间来执行(加上将命令发送到服务器并解析响应的微不足道的开销) .
当然,手动循环遍历任何客户端并执行每个项目的操作将会相当慢 - 现在您每行都有相同的开销 .
ORM在传统上对数据进行批量更改也非常糟糕,因为它们倾向于检查每个对象的状态并发出单独的更新语句(与循环相同,除非通常每个项目处理更多) .
有一些方法可以减少开销(连接池是主要候选者)但是你只是在减轻这个问题 .
简而言之,如果您希望SQL一次性完成所有处理,您需要一次性向其发送处理所需的所有信息...
编辑
我没有使用't know all the optimizations used by the framework but one of them is called Lazy Loading. It populates data when it',而不是在定义请求时 . More details .
简而言之,它不是加载所有数据,而是通过引用应该检索的数据来填充对象 .
例如,而不是像...那样的行
等等...
它填充它们:
然后,当你真正使用该属性时......
它检索所需的特定值 . 在上面的例子中,它从不困扰从数据库中读取年龄 .
看一下
IQueryable
接口以及它如何用于实现延迟加载 .