none
一次性批量修改数据库中的数据 RRS feed

  • 问题

  • 我把从数据库中读取的数据经处理后放在DataTable中,包括主键ID,之后我想根据每行ID,把DataTable中的数据一次性修改到数据库中,只是某些字段修改而已,请问用什么实现比较好,有没有实例?

    2010年2月5日 1:29

答案

全部回复

  • 你使用DataAdapter的UPDATE方法实现
    参照:http://blog.sina.com.cn/s/blog_60570c780100fz4f.html

    public   DataSet   CreateCmdsAndUpdate(DataSet   myDataSet,string   myConnection,string   mySelectQuery,string   myTableName)     
      {   
              OleDbConnection   myConn   =   new   OleDbConnection(myConnection);   
              OleDbDataAdapter   myDataAdapter   =   new   OleDbDataAdapter();   
              myDataAdapter.SelectCommand   =   new   OleDbCommand(mySelectQuery,   myConn);   
              OleDbCommandBuilder   custCB   =   new   OleDbCommandBuilder(myDataAdapter);   
        
              myConn.Open();   
        
              DataSet   custDS   =   new   DataSet();   
              myDataAdapter.Fill(custDS);   
        
              //code   to   modify   data   in   dataset   here   
        
              //Insert   new   records   from   DataSet   
              DataRow[]   myDataRowArray   =   custDS.Tables[0].Select(null,   null,   DataViewRowState.Added);   
              myDataAdapter.Update(myDataRowArray);   
        
              myConn.Close();   
        
              return   custDS;   
        }   
    

    努力+方法=成功
    2010年2月5日 1:53
  • 你好!

    首选使用 SqlDataAdapter.Update 方法,通过设计 UpdateCommand 的 CommandText 可以达到个性化的更新。

    另外一种就是自己根据 DataTable 生成 Sql 命令。

    知识改变命运,奋斗成就人生!
    2010年2月5日 1:56
    版主
  • 如果用UpdateCommand ,那些参数会自动匹配Datatable中的数据吗?
    2010年2月5日 2:13
  • 你需要在设置 CommandText 后,然后为 Command 添加 Parameter 时,指定 Paramter 的 SourceColumn 属性。参数与字段之间的关系也是通过这个属性确定的。
    知识改变命运,奋斗成就人生!
    2010年2月5日 2:27
    版主
  •  我的代码如下:
                SqlConnection con = new SqlConnection("server=(local);Database=Test;uid=sa;pwd=wuyuan;Integrated Security=SSPI");
                SqlDataAdapter sda = new SqlDataAdapter();
                SqlCommandBuilder scb = new SqlCommandBuilder(sda);
                sda.UpdateCommand = new SqlCommand("updata flexa set maintain=@maintain,cline=@cline,no_energy=@no_energy,wait=@wait,eating=@eating,no_arrange=@no_arrange where change_id=@change_id", con);
                sda.UpdateCommand.Parameters.Add("@maintain", SqlDbType.Decimal, 9, "Maintain");
                sda.UpdateCommand.Parameters.Add("@cline", SqlDbType.Decimal, 9, "changeover");
                sda.UpdateCommand.Parameters.Add("@no_energy", SqlDbType.Decimal, 9, "No_energe");
                sda.UpdateCommand.Parameters.Add("@wait", SqlDbType.Decimal, 9, "wait");
                sda.UpdateCommand.Parameters.Add("@eating", SqlDbType.Decimal, 9, "Eating");
                sda.UpdateCommand.Parameters.Add("@no_arrange", SqlDbType.Decimal, 9, "No_arrange");
                sda.UpdateCommand.Parameters.Add("@change_id", SqlDbType.Int, 4, "change_id");
                sda.Update(newdt);
                con.Close();

    运行时,提示:DataAdapter.SelectCommand 属性需要初始化。
    可是我不需要select,我的数据已经在DataTable了,请问要如何解决?
    2010年2月5日 3:38
  • 你这样。

    1 使用强类型数据集的方式。在你的工程中拖放一个 DataSet 再将你数据库中的表拖放到 DataSet 中,会自动生成一个 TableAdapter 然后你去修改 TableAdapter 的 UpdateCommand。使用这种方式 SelectCommand 会自动为你生成好你就不需要再关心这个问题了。

    2 自己遍历 DataTable 生成提交语句,将变化提交到数据中。

    这里两种方式都差不多,如果你只用于更新那么第二种方式可能更适合你。

    知识改变命运,奋斗成就人生!
    2010年2月5日 3:45
    版主
  • 如果用第二种的话,那不是会频繁的连接数据库?
    2010年2月5日 3:48
  • 不需要,记得上次回复过你关系一个执行效率的问题。采用回复中第3点,一次连接多次交互。


    知识改变命运,奋斗成就人生!
    2010年2月5日 3:50
    版主
  • 上次我时采用更改查询语句,那这次我试试看第三种好了
    2010年2月5日 4:14
  • 又一个问题搞定了,哈哈,谢谢各位

    2010年2月5日 5:56