我想要一键更新 DataSet 里所有 DataTable 的数据,应该用什么方法呢~? 我想要一键更新 DataSet 里所有 DataTable 的数据,应该用什么方法呢~? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 循环更新每个DataTable,循环每个DataTable中的行,根据行状态生成增删改语句,然后执行。 /**//*在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更高效 */ DataSet直接转写成 DataTable就行了DataSet.Table[0],不需要更新DataTable,可必呢。 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"; //选择正确的数据库 }谢谢。 你更新DataSet后获取DataSet数据集,这样就应该可以了吧! c#开发excel外接程序更新问题 必须声明变量@userid?? C#中的DataGridView控件如何动态显示数据库数据(数据库已连接) C#开发CE/Mobile招人~ 我要一直监视数据库某条记录是否被操作怎么做?我用了递归?出现异常?? ie7,FF 中AJAXPRO 调用CS方法的返回值都是正常的,IE6为NULL c#菜鸟提问,关于COM口通信和TCP协议的 C#中调用C++的dll时bstr类型转换的问题 如何跳出处理过程? 请问用C#做windows 应用程序好 还是 做web应用程序好? 如何批量清空comboBox和textBox控件? 什么地方错了???
循环更新每个DataTable,循环每个DataTable中的行,根据行状态生成增删改语句,然后执行。
/**//*在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更高效
*/
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"; //选择正确的数据库
}
谢谢。