首页 文章

一次性向数据表中添加多个空行(如何以比循环更快的速度插入数据)

提问于
浏览
1

如何在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 回答

  • 0

    快速的SQL-Only方法将多行从一个表中插入另一个表中 .

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

    请注意,生成数据的查询可能非常复杂,只需添加 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 .

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

    例如,而不是像...那样的行

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

相关问题