DataAdapter 和 Dataset 仅更新做了修改的数据,
它这个机制是如何实现的?

解决方案 »

  1.   

    对与DataSet中修改和删除的列都有相应的标识,提交的数据库时根据此标识进行更改
      

  2.   

    DataSet(DataTable)是数据库表的客户端的一个缓存或拷贝。在客户对DataTable进行增、删、改操作时会在对应的DataRow上标上记号,如Added, Modified, Deleted等。
    DataAdapter.Update时会轮循这些DataRow,根据标记(RowState)执行相应的Sql语句。
      

  3.   

    接点分
    补充
    查看DataRowView类得相关知识是否是需要
      

  4.   

    用的是RowState,但是这个方法一般不用
      

  5.   

    使用SqlCommandBuilder 自动生成SQL,自动更新        /// <summary>
            /// 根据数据集修改数据库
            /// </summary>
            /// <param name="ds">数据集</param>
            /// <param name="sql">获得次数据集的查询语句或存储过程</param>
            /// <param name="parameters">参数列表</param>
            /// <returns>受影响的行数</returns>
            public static int AcceptChanges(DataSet ds, string sql, params SqlParameter[] parameters)
            {
                int rows = 0;
                //取出表结构
                SqlCommand cmd = new SqlCommand(sql, conn);
                if (sql.ToLower().StartsWith("select "))
                {
                    cmd.CommandType = CommandType.Text;
                }
                else
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                }
                if (parameters != null)
                {
                    for (int i = 0; i < parameters.Length; i++)
                    {
                        cmd.Parameters.Add(parameters[i]);
                    }
                }
                SqlDataAdapter da = new SqlDataAdapter();
                da.SelectCommand = cmd;
                //生成实现 DataSet 的更改与关联的 SQL Server 实例之间的协调所需的 Transact-SQL 语句。
                SqlCommandBuilder cb = new SqlCommandBuilder(da);
                try
                {
                    rows = da.Update(ds, sql);
                    ds.AcceptChanges();
                }
                catch
                {
                }
                return rows;
            }
      

  6.   

    使用SqlCommandBuilder 时必须先查询,取出表结构和数据然后和修改过的数据集进行比较
    所以数据集使用什么查询语句查出的,这里还需要用什么语句查询,这点非常重要