zoukankan      html  css  js  c++  java
  • DataSet中的数据全部插入数据库

    首先,用Select语句查询需要插入数据的表,用Top 1查一行就够了,但这个表中需要有一行数据,这个是为了给SqlDataAdapter生成表的架构用的。
    1.string strSql = "Select * from TableNeedToUpdate"; 
    2.SqlDataAdapter da = new SqlDataAdapter(strSql, SqlConn); 
    3.DataSet ds = new DataSet();
    U%oYY-Ec0 
    4.da.Fill(ds);
    +X*@ s$@-{-?0 
    5.//设置主键 
    6.ds.Tables[0].PrimaryKey = new DataColumn[] { ds.Tables[0].Columns[0] };
    @%b2Dn4N1G?;D p0
    其次,用SqlCommandBuilder为SqlDataAdapter生成用于添加、删除、更新的Command。
    1.SqlCommandBuilder cmdb = new SqlCommandBuilder(da); 
    2.//da.InsertCommand = cmdb.GetInsertCommand(); 
    3.//da.UpdateCommand = cmdb.GetUpdateCommand(); 
    4.//da.DeleteCommand = cmdb.GetDeleteCommand(); 
    5.
    P(PPQCrD6@ m3M0
    然后,如果根据要插入的数据生成新行。
    1.foreach (DataRow dr in dtNew.Rows) 
    2.{ 
    3.      DataRow drNew = ds.Tables[0].NewRow(); 
    4.      drNew.ItemArray = dr.ItemArray; 
    5.      ds.Tables[0].Rows.Add(drNew); 
    6.}
    最后,用da.Update(ds),即可将数据一次性插入数据库中。
    ITPUB个人空间v;|"J9v)e g'm
    
    对于一些特殊情况,比如新插入数据跟原表中数据主键冲突的情况,则要多费点周折。正常情况下,这种情况应该是用更新来处理,而不是用插入。但有的时候,更新比较麻烦的时候,也可以用先删除,后插入的方式来处理。
    
    n)Yb3y1z4jii k0
    举个例子,也就是我这一次处理的情况。我需要定时从一个系统读取数据写入另外一个系统。数据源的数据是不定时更新的,没有更新标识,每次读取的时候,根本不知道哪些数据是新增的或是修改过的(当然也可以通过主键来进行判断,但是比较麻烦)。这个时候,不能直接将这些数据写入目的数据库,因为可能会有主键重复的问题,所以需要先删除目的数据库中的数据,然后将新数据一次性全部写入数据库。
    ITPUB个人空间qm jWr(`Y
    
    这个流程说起来非常清楚,问题在于如何删除目的数据库旧数据。我之前采取的方法是用Table.Rows.Clear()方法:
    1.ds.Tables[0].Rows.Clear(); 
    2.da.Update(ds); 
    3.ds.AcceptChanges();   
    这样操作之后,插入新数据,会出现“主键重复”的错误。而只能采用Table.Rows.Delete()方法:
    1.            for (int i = 0; i < ds.Tables[0].Rows.Count; i++) 
    2.            { 
    3.                ds.Tables[0].Rows[0].Delete(); 
    4.            } 
    5.            da.Update(ds); 
    6.            ds.AcceptChanges();
    究其原因,是跟SqlDataAdapter的处理机制有关系的。SqlDataAdapter.Update()是根据DataSet中DataRow的状态标记来处理的,比如我们用DataSet.Tables[0].Rows.Add(drNew)来添加一行时,drNew会有一个状态Added,执行SqlDataAdapter.Update()时,会根据这个状态对数据行进行处理,对应的,更新的数据行会有Updated状态,删除的数据行会有Deleted状态。
    ITPUB个人空间+c/o2`9z/
    
    对于Rows.Clear()方法,是将数据从数据表中清除,它不会为被删除的行添加标记,所以在执行SqlDataAdapter.Update()时就不会首先将表中的数据删除,从而导致主键重复的错误。而对于Rows.Delete(),它不会直接把数据行删除,而是加上Deleted标记,所以可以在Update的时候正确的将数据删除。
    

  • 相关阅读:
    SublimeText4 相比3的更新亮点与安装
    [原创]产品和成本效率总结提炼
    [原创]企业的生命周期总结提炼
    [原创]从不确定到确定性总结提炼
    [原创]验证需求(需求三角)总结提炼
    [原创] Test Card 模型用于验证商业 Idea(想法)总结提炼
    [原创]精益画布(lean canvas)总结提炼
    [原创]商业画布( Business Model Generation)总结提炼
    [原创]总结常见获客渠道
    [原创]什么是增长总结提炼
  • 原文地址:https://www.cnblogs.com/xiaofengfeng/p/2216379.html
Copyright © 2011-2022 走看看