我想要一键更新 DataSet 里所有 DataTable 的数据,应该用什么方法呢~?

解决方案 »

  1.   


    循环更新每个DataTable,循环每个DataTable中的行,根据行状态生成增删改语句,然后执行。
      

  2.   


     /**//*在DataTable中选择记录*/
                /**//* 向DataTable中插入记录如上,更新和删除如下:
                 * ----但是在更新和删除前,首先要找出要更新和删除的记录。
                 * 一种方法是遍历DataRow,搜索想要的记录,
                 * --〉然而更聪明的办法是使用DataTable.Select方法:table.Select();
                 * table.Select();//返回DataRow[],可以包含一行或多行,
                 * 取决于Select()的参数(filter)
                 * gets an array of all Data.DataRow objects that match the
                 * filter in the order of the sort 
                 * that match the specified state
                 */
                DataRow[] arrRows = table.Select("title_id='JP1001'");
                /**//*
                 * 下面这条语句选择(返回)"Price"字段值小于10的DataRow
                 */
                DataRow[] arrRows = table.Select("price<10.00");
                /**//*
                 * 下面这条语句选择Pubdate字段日期在2000年1月1日当天或之后的DataRow 
                 */
                DataRow[] arrRows = table.Select("pubdate>='#1/1/2000#'");
                /**//*如果想知道Select返回了多少行,读取数组的Length属性*/
                /**//*传递给DataTable.Select()的筛选器表达式: 
                 * 下面比较操作符可以被支持:<,<=,=,>=,>和<>也可以使用IN和Like
                 */
                //返回"state"等于CA、TN或WA的所有行
                DataRow[] arrRows = table.Select("state in('ca','tn','wa')");
                //返回"state"以CA开头的所有行
                DataRow[] arrRows = table.Select("state like 'ca*'");
                //还可以使用一些Sql函数,在DataTable中选择State字段为空的记录
                DataRow[] arrRows = table.Select("isnull(state,0)=0");
                //还可以使用And、Or和Not
                DataRow[] arrRows = table.Select("state='tn' and zip like '37*'");
                /**//*总之,可以用括号分组,创建复杂的布尔表达式*//*在DataTable中更新数据*/
                /**//*
                 * 确定了要在DataTable中更新的记录后,
                 * 只要把记录的一个或多个字段替换成要更新的值即可,
                 * 下面的例子选择Pubs数据库的Titles表中所有ytd_sales大于10000的记录
                 * 把它们的价格加10.00
                 */
                SqlDataAdapter adapter = new SqlDataAdapter(strSql, strConn);
                DataSet ds = new DataSet();
                adapter.Fill(ds, "Titles");            DataTable table = ds.Tables["Titles"];
                DataRow[] arrRows = table.Select("ytd_sales>10000");
                foreach (DataRow row in arrRows)
                {
                    row["price"] = (decimal)row["price"] + 10.00m;
                }/**//*从DataTable中删除记录*/
                /**//*
                 * 对每个要删除的行调用Delete就行了。
                 */
                /**//*
                 * 下面删除ytd_sales小于10000或等于空的记录
                 * 
                 */
                SqlDataAdapter adapter = new SqlDataAdapter(strSql, strConn);
                DataSet ds = new DataSet();
                adapter.Fill(ds, "Titles");            DataTable table = ds.Tables["Titles"];
                DataRow[] arrRows = table.Select("ytd_sales<10000 or isnull(ytd_sales,0)=0");
                foreach (DataRow row in arrRows)
                {
                    row.Delete();
                } /**//*把更改写回数据库DataAdapter.Update*/
                /**//*Important: 这种在DataTable中进行的插入、更新和删除并不会自动写回数据库 
                 */
                SqlDataAdapter adapter = new SqlDataAdapter(strSql, strConn);
                SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
                DataSet ds = new DataSet();
                adapter.Fill(ds, "Titles");
                
                //插入记录
                DataTable table = ds.Tables["Titles"];
                DataRow row = table.NewRow();
                row["Title_id"] = "JP1001";
                row["title"] = "programming Microsoft .NET";
                row["price"] = 59.99m;
                row["ytd_sales"] = 100000;
                row["type"] = "business";
                row["pubdate"] = new DateTime(2002, 5, 1);
                table.Rows.Add(row);
                //更新数据库
                adapter.Update(table);
                
                /**//*DataAdapter的Update方法检查传递给表的每一条记录,把自从上次更新
                 * (或自从上次调用table的AcceptChanges方法后)被插入、更新或删除的行
                 * 写回数据库。如果DataSet中包含了多个被修改的DataTable,就把整个DataSet
                 * 传给Update方法: adapter.Update(ds),所有改变会被一次性写回。
                 */
                /**//*
                 * 哦,还有许多演示DataAdapter.Update的用法的示例,演示了通过调用名为GetChanges
                 * 的方法创建一个只含有被插入、更新或删除行的新的临时DataSet或者DataTable
                 * ,然后把delta传递给DataAdapter.Update,如下:
                 * //更新数据库
                 * DataTable delta = table.GetChanges();
                 * adapter.Update(delta);
                 * 这种方法的确好用,但不是必需的。Update会忽略包含已修改和未修改的行的DataTable中
                 * 未被修改的行。
                 * 当要控制写回数据库中的更改的内容的顺序时,GetChanges方法发挥作用,
                 * 如果想在Insert前面执行Delete,以避免主键重复错误,应该这样做: 
                 */
                //DataRowState ---->enum System.Data.DataRowState
                //DataRowState.Deleted---->the row was deleted 
                //                        using the row.Delete()
                DataTable deletes = table.GetChanges(DataRowState.Deleted);
                adapter.Update(deletes);
                DataTable inserts = table.GetChanges(DataRowState.Added);
                adapter.Update(inserts);
                /**//*GetChanges的另一个用处是,
                 * 当更新不是在本地执行时,把机器间的数据传输量减到最小,
                 * 只传递被改变的DataSet或DataTable比传递整个DataSet或DataTable更高效              
                 */
      

  3.   

     DataSet直接转写成 DataTable就行了DataSet.Table[0],不需要更新DataTable,可必呢。
      

  4.   


    public void Form4_Load(object sender, EventArgs e)
            {           sqlexe sqlexe=new sqlexe();           string sqlword = "select * from room";            sqlhelper sqldata = new sqlhelper();//实例化sqlhelper类,再调用类里的sqlconn 调用数据连接字符串            string strconn = sqldata.sqlconnstr;            SqlConnection conn = new SqlConnection(strconn);  //建立数据库连接            conn.Open();                        //连接数据            SqlCommand cmd = new SqlCommand();     //创建sqlcommand对象            cmd.Connection = conn;                 //指定使用conn链接数据库            cmd.CommandText = sqlword;            cmd.CommandType = CommandType.Text;            SqlDataAdapter sda = new SqlDataAdapter();            sda.SelectCommand = cmd;            DataSet ds = new DataSet();            sda.Fill(ds);            dataGridView1.DataSource = ds.Tables[0];            conn.Close();            //return sda;            ////////////////////////////////////           
            }
    public void button1_Click(object sender, EventArgs e)
            {
             
                sqlexe sqlexe = new sqlexe();            string sqlword = "select * from room";            sqlhelper sqldata = new sqlhelper();//实例化sqlhelper类,再调用类里的sqlconn 调用数据连接字符串            string strconn = sqldata.sqlconnstr;            SqlConnection conn = new SqlConnection(strconn);  //建立数据库连接            conn.Open();                        //连接数据            SqlCommand cmd = new SqlCommand();     //创建sqlcommand对象            cmd.Connection = conn;                 //指定使用conn链接数据库            cmd.CommandText = sqlword;            cmd.CommandType = CommandType.Text;            SqlDataAdapter sda = new SqlDataAdapter();            sda.SelectCommand = cmd;            DataSet ds = new DataSet();            sda.Fill(ds);            SqlCommandBuilder objBuilder = new SqlCommandBuilder(sda);            sda.Update(ds);            ds.AcceptChanges();            MessageBox.Show("success");        }
     public class sqlhelper    //连接数据库文件sql语句
            {
              public string sqlconnstr="Data Source=.\\SQLEXPRESS;User id=sa12;Pwd=12;database=wj"; //选择正确的数据库
            }
    谢谢。
      

  5.   

    你更新DataSet后获取DataSet数据集,这样就应该可以了吧!