窗体上有个datagridview,数据源是datatable,
窗体修改数据保存到了DataTable里,
如何直接更新这个DataTable的数据呢?

解决方案 »

  1.   

    再次读取数据库 重新绑定数据
     此消息通过 【CSDN论坛 Winform测试版】 回复!有关此工具
      

  2.   


    LZ的意思是。。不改数据库只能这个DataTable进行更新?
      

  3.   


    如果只更新DataTable。。直接就是改  DataRow dr =  DataTable.rows[索引];dr["列"] = "XXX";
      

  4.   

    说的太简单了,就是通过DataAdpater.update来更新datatable到数据库
    这样不用for循环来更新所有gridview里的数据了,
    因为for循环每次都要打开关闭连接.
      

  5.   

    楼主已经说了:窗体修改数据保存到了DataTable里
    他问的是:如何把DataTable里的数据更新到数据库
      

  6.   

    不是只有一个dgv吗,怎么会用到for循环?
      

  7.   


    dgv里又不是只有一行数据,
      

  8.   

    我现在是这样做的,虽然可以实现功能,但感觉表示层不应该涉及到数据层的操作
    数据层代码/// <summary>
            /// 获得数据列表
            /// </summary>
            public DataSet GetList(string strWhere,ref OleDbDataAdapter oda)
            {
                StringBuilder strSql = new StringBuilder();
                strSql.Append("select AssayChineseName,AssayEnglishName,AssayAb,ArticalNO,ClassID,PrintS ");
                strSql.Append(" FROM Assay_All ");
                if (strWhere.Trim() != "")
                {
                    strSql.Append(" where " + strWhere);
                }
                strSql.Append("  ORDER BY PrintS");
                using (OleDbConnection connection = new OleDbConnection(DBHelperOleDb.connectionString))
                {
                    DataSet ds = new DataSet();
                    try
                    {
                        connection.Open();
                        oda = new OleDbDataAdapter(strSql.ToString(), connection);
                        oda.UpdateCommand = new OleDbCommand("UPDATE Assay_All SET PrintS=@PrintS WHERE AssayAb=@AssayAb ", new OleDbConnection(DBHelperOleDb.connectionString));
                        oda.UpdateCommand.Parameters.Add("Prints", OleDbType.Integer, 32, "Prints");
                        oda.UpdateCommand.Parameters.Add("AssayAb", OleDbType.VarChar, 32, "AssayAb");
                        oda.Fill(ds, "ds");
                    }
                    catch (System.Data.OleDb.OleDbException ex)
                    {
                        throw new Exception(ex.Message);
                    }
                    return ds;
                }
            }BLL层略
    表示层
    //首先实例化dataadapter
     OleDbDataAdapter oda = new OleDbDataAdapter();//绑定数据时候的操作
    DataTable dt = new Assay_AllManager().GetList("", ref oda).Tables[0];
                dgvPrintIndex.DataSource = dt;然后各种在dgv的操作保存到datatable
    //最后一起更新 //获取修改后的DataTable
                DataTable dt = dgvPrintIndex.DataSource as DataTable;
                DateTime dtstart = DateTime.Now;         
                oda.Update(dt);
                dt.AcceptChanges();
                TimeSpan ts = DateTime.Now.Subtract(dtstart);
                mainfrm.SetLablStatue = "保存成功!耗时:" + ts.TotalSeconds.ToString();
                timerClear.Enabled = true;
    这样子虽然可以实现,感觉不是很好,有更好的方法么?另外,dataadpter效率怎么跟for循环相差那么大,
    同样多的数据,50条左右
    for循环更新需要4秒左右,
    而DataAdapter居然只要0.125秒!!!
    for循环就是遍历dgv
    然后每一行调用dbhelper.execute更新.
      

  9.   

    你的DataSet/DataTable与数据库之间不是有个DataAdapter吗? 怎么把它忘了?
      

  10.   

     OleDbConnection conn = new OleDbConnection(DBHelperOleDb.connectionString);
                conn.Open();
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    string sqlstr = "UPDATE Assay_All SET PrintS=" + dt.Rows[i]["PrintS"].ToString() + " WHERE AssayAb='" + dt.Rows[i]["AssayAb"].ToString() + "'";
                    OleDbCommand cmd = new OleDbCommand(sqlstr, conn);
                    cmd.ExecuteNonQuery();
                }           
                conn.Close();
    效率问题已解决!多谢各位.
    看来一直存在误区啊,批量更新不能
      

  11.   

    批量修改数据操作一般不支持用Update
    特别是涉及有更新的有删除的有新增的,建议统统删除然后重新Insert一次,,其实Update也是先Delete再Insert的
      

  12.   

    利用SqlCommandBuilder对象可以直接进行更新。
      

  13.   

    我现在是 DataTable.GetChanges(),这样可以取得仅改动过的,
    然后 New 一个Model ,然后再Update/Add(Insert)/Delete另外: Update的,只能Update的,有一些有关联的关键字的,不能Delete……但有一个缺点,是一句一句执行的,若有一条不成功,已经操作的已经写入数据库,没有加滚项目初期,暂时没考虑那么多……   因为用的代码生成器,就懒得改动了,也没咐好办法 …… 楼主在13的方法,新增的或删除掉的,就没啥办法了吧…… 关键对于各种各样的表来讲,不能通用吧(最好能够实现可以用代码生成器,一次性生成的,还得考虑是三层架构的!直接写代码就失去意义了)盼继续讨论! Mark
      

  14.   


    是用 GetChanges() 获取修改后的记录,不过后之是开启事务来进行处理,手动处理异常,这样就不会有你说的情况。
      

  15.   


    定义一个类似 BLL.Update(datatable) 这样的功能调用就行嘛。
      

  16.   

    直接循环datatable 改变里面的值
      

  17.   


    如果客户端调用BLL也涉及回滚,那么你的客户端设计到底是数据库操作还是业务操作呢?例如说定旅行合同,结果在最后一步客户放弃了,那么这个回滚是业务逻辑,而不是什么数据库回滚。BLL根本没有什么数据库回滚这一说。如果说你“一句一句地执行的,现在需要回滚”,这说明你缺少作为一个业务而集中提交多个句子的BLL功能,是BLL接口设计缺乏必要的需求分析。而回滚之类的东西是在这个缺失的BLL功能内部的事情。
      

  18.   

    对楼上无语了
    讨论的问题,修改DataTable后,怎么样将其写数据库……
    即然是DataTable,肯定涉及到 Delete/Update/Insert等
    这些操作,不可能在Bll中的某一个功能实现楼主困惑也在此,在三层中,同时做这些是比较麻烦……
      

  19.   


    想写一个对任意的DataTable有效的,比较麻烦! 楼主的重点也在些,怎么样符合三层思想(尽量方便的),解决DataTable写入DataBase的问题楼主是吧,呵呵,对于这个问题,我考虑的比较多……