datable合并sqldataadapter不能update的思考
来源:互联网 发布:北风网大数据百度云 编辑:程序博客网 时间:2024/05/16 15:57
从数据库中读取两个dataset,如下面所示,通过merge函数,将两个datatable放在一块,此时合成的datatable是在gridview显示的是两个表中的数据,但是当用SqlDataAdapter.Update进行数据库表的更新时,是不能更新的,这个时候
解决办法:手动插入数据,进行状态位的改变
string constring = ConfigurationManager.AppSettings["ConString"]; using (SqlConnection conn = new SqlConnection(constring)) { conn.Open(); SqlDataAdapter da = new SqlDataAdapter("select * from t_tmp", conn); DataSet ds = new DataSet("table"); da.Fill(ds, "table"); SqlDataAdapter da2 = new SqlDataAdapter("select * from t_citycode where citycode='11'", conn); DataSet ds2 = new DataSet("table2"); da2.Fill(ds2,"table2"); DataRow row = ds2.Tables[0].NewRow(); ds2.Tables[0].Rows.Add(row); //ds.Tables[0].Merge(ds2.Tables[0], true); ds.Tables[0].Merge(ds2.Tables[0]); SqlCommandBuilder cb = new SqlCommandBuilder(da); da.InsertCommand = cb.GetInsertCommand(); Response.Write(cb.GetInsertCommand().CommandText); da.Update(ds.Tables[0]); ds.Tables[0].AcceptChanges(); gv.DataSource = ds.Tables[0]; gv.DataBind(); }
我们用下面的语句看一下每一行的RowState,发现全部都是unchanged,这是因为,在两个表进行合成的时候,两个表中的数据进行的是简单的合并,而并不存在数据的修改或者删除或者增加等状态的改变,而SqlDataAdapter.Update识别的是每一行状态,全部 为unchanged,自然,update也是不会响应的。
foreach (DataRow r in ds.Tables[0].Rows) { Response.Write(r.RowState); }
解决办法:手动插入数据,进行状态位的改变
using (SqlConnection cnn = new SqlConnection(constring)) { cnn.Open(); string select = "select * from t_feerecord"; SqlDataAdapter sda = new SqlDataAdapter(select, cnn); DataSet ds = new DataSet(); sda.Fill(ds, "table"); DataTable dt = ds.Tables["table"]; SqlCommandBuilder cb = new SqlCommandBuilder(sda); sda.InsertCommand = cb.GetInsertCommand(); foreach (GridViewRow row in gv_batch.Rows) { string name = row.Cells[0].Text.ToString(); string sex = row.Cells[1].Text.ToString(); string duty = row.Cells[3].Text.ToString(); string type = row.Cells[4].Text.ToString(); string rank = row.Cells[5].Text.ToString(); string policeid = row.Cells[6].Text.ToString(); string idcardnum = row.Cells[7].Text.ToString(); string worktime = row.Cells[8].Text.ToString(); string workplace = row.Cells[9].Text.ToString(); //获取隐藏列的值 string usernum = gv_batch.DataKeys[row.RowIndex]["user_num"].ToString(); DataRow dr = dt.NewRow(); dr[1] = name; dr[2] = sex; dr[3] = duty; dr[4] = type; dr[5] = rank; dr[6] = policeid; dr[7] = idcardnum; dr[8] = workplace; dr[9] = worktime; dr[10] = usernum; dt.Rows.Add(dr); } foreach (DataRow r in dt.Rows) { Response.Write(r.RowState); } sda.Update(dt); dt.AcceptChanges(); }
补充:对于DATASET的MERGE命令,加进去的DATATABLE按照递增顺序,从1往后加,比如dataset1本来包含一张表,即dataset1.table[0],而又dataset1.merge(datatable2),则datatable2默认的就是dataset.table[1].dataset默认使用的都是dataset1.table[0]!!!
- datable合并sqldataadapter不能update的思考
- 关于SqlDataAdapter的Update()方法
- 关于SqlDataAdapter的Update()方法
- SqlDataAdapter Update
- SqlDataAdapter Update
- SqlDataAdapter.TableMappings.Add()和SqlDataAdapter.Update()的参数问题。
- SqlDataAdapter 的用法------不能进行更新
- 关于SqlDataAdapter的Update()方法的原理[转]
- 在C#使用SqlDataAdapter的Update更新数据
- C#使用SqlDataAdapter的Update方法更新数据
- C#中关于SqlDataAdapter的Update(dataTable)方法
- SqlDataAdapter.Update()方法与SqlCommandBuilder
- SqlDataAdapter SqlCommandBuilder update 批量更新
- SqlDataAdapter.Update批量数据更新
- SqlDataAdapter.Update批量数据更新
- SqlDataAdapter.Update批量数据更新
- Excel与datable的转换
- 使用Datable 的小例子
- 关于oracle中的group by、having以及order by
- ORACLE CASE用法
- 什么叫MVC模式
- C++动态链接/静态链接库编程
- spark开发环境配置
- datable合并sqldataadapter不能update的思考
- 排序算法--希尔排序
- java类反射机制
- 面试相关
- 未能解析此远程名称:’nuget.org’(The remote name could not be resolved: 'nuget.org')
- 黑马程序员-多线程
- 返回json对象到页面
- 如何打造一个高人气,高质量的软文
- F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*),相信大家还记得,现在是已知F0=a,F1=b和fn的值,求: