三层架构如何更新DataTable? 窗体上有个datagridview,数据源是datatable,窗体修改数据保存到了DataTable里,如何直接更新这个DataTable的数据呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 再次读取数据库 重新绑定数据 此消息通过 【CSDN论坛 Winform测试版】 回复!有关此工具 LZ的意思是。。不改数据库只能这个DataTable进行更新? 如果只更新DataTable。。直接就是改 DataRow dr = DataTable.rows[索引];dr["列"] = "XXX"; 说的太简单了,就是通过DataAdpater.update来更新datatable到数据库这样不用for循环来更新所有gridview里的数据了,因为for循环每次都要打开关闭连接. 楼主已经说了:窗体修改数据保存到了DataTable里他问的是:如何把DataTable里的数据更新到数据库 不是只有一个dgv吗,怎么会用到for循环? dgv里又不是只有一行数据, 我现在是这样做的,虽然可以实现功能,但感觉表示层不应该涉及到数据层的操作数据层代码/// <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更新. 你的DataSet/DataTable与数据库之间不是有个DataAdapter吗? 怎么把它忘了? 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();效率问题已解决!多谢各位.看来一直存在误区啊,批量更新不能 批量修改数据操作一般不支持用Update特别是涉及有更新的有删除的有新增的,建议统统删除然后重新Insert一次,,其实Update也是先Delete再Insert的 利用SqlCommandBuilder对象可以直接进行更新。 我现在是 DataTable.GetChanges(),这样可以取得仅改动过的,然后 New 一个Model ,然后再Update/Add(Insert)/Delete另外: Update的,只能Update的,有一些有关联的关键字的,不能Delete……但有一个缺点,是一句一句执行的,若有一条不成功,已经操作的已经写入数据库,没有加滚项目初期,暂时没考虑那么多…… 因为用的代码生成器,就懒得改动了,也没咐好办法 …… 楼主在13的方法,新增的或删除掉的,就没啥办法了吧…… 关键对于各种各样的表来讲,不能通用吧(最好能够实现可以用代码生成器,一次性生成的,还得考虑是三层架构的!直接写代码就失去意义了)盼继续讨论! Mark 是用 GetChanges() 获取修改后的记录,不过后之是开启事务来进行处理,手动处理异常,这样就不会有你说的情况。 定义一个类似 BLL.Update(datatable) 这样的功能调用就行嘛。 直接循环datatable 改变里面的值 如果客户端调用BLL也涉及回滚,那么你的客户端设计到底是数据库操作还是业务操作呢?例如说定旅行合同,结果在最后一步客户放弃了,那么这个回滚是业务逻辑,而不是什么数据库回滚。BLL根本没有什么数据库回滚这一说。如果说你“一句一句地执行的,现在需要回滚”,这说明你缺少作为一个业务而集中提交多个句子的BLL功能,是BLL接口设计缺乏必要的需求分析。而回滚之类的东西是在这个缺失的BLL功能内部的事情。 对楼上无语了讨论的问题,修改DataTable后,怎么样将其写数据库……即然是DataTable,肯定涉及到 Delete/Update/Insert等这些操作,不可能在Bll中的某一个功能实现楼主困惑也在此,在三层中,同时做这些是比较麻烦…… 想写一个对任意的DataTable有效的,比较麻烦! 楼主的重点也在些,怎么样符合三层思想(尽量方便的),解决DataTable写入DataBase的问题楼主是吧,呵呵,对于这个问题,我考虑的比较多…… 图片、视频如何入数据库啊 winform登录 求AVAYA中文开发文档(c#) 使用WMEncoder中视频源设备的属性窗体如何调用(高分求解) C#开发成绩统计系统关于操作EXCEL疑问 sqlparameter的使用介绍 ***** 请问下面4句分别是什么意思? -----〉〉论天下谁是英雄! 请教:一个DataSet(数据来源为数据库)绑定到DataGrid.然后使用DataGridTableStyle改变DataGrid的显示(比如说标题字变大一点),问题出来了. 很简单的一个清除问题!谢谢大家帮助! 导出Excel 哪位大神人物给我一份折叠菜单的源码啊!!【十万火急】
此消息通过 【CSDN论坛 Winform测试版】 回复!有关此工具
LZ的意思是。。不改数据库只能这个DataTable进行更新?
如果只更新DataTable。。直接就是改 DataRow dr = DataTable.rows[索引];dr["列"] = "XXX";
这样不用for循环来更新所有gridview里的数据了,
因为for循环每次都要打开关闭连接.
他问的是:如何把DataTable里的数据更新到数据库
dgv里又不是只有一行数据,
数据层代码/// <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更新.
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();
效率问题已解决!多谢各位.
看来一直存在误区啊,批量更新不能
特别是涉及有更新的有删除的有新增的,建议统统删除然后重新Insert一次,,其实Update也是先Delete再Insert的
然后 New 一个Model ,然后再Update/Add(Insert)/Delete另外: Update的,只能Update的,有一些有关联的关键字的,不能Delete……但有一个缺点,是一句一句执行的,若有一条不成功,已经操作的已经写入数据库,没有加滚项目初期,暂时没考虑那么多…… 因为用的代码生成器,就懒得改动了,也没咐好办法 …… 楼主在13的方法,新增的或删除掉的,就没啥办法了吧…… 关键对于各种各样的表来讲,不能通用吧(最好能够实现可以用代码生成器,一次性生成的,还得考虑是三层架构的!直接写代码就失去意义了)盼继续讨论! Mark
是用 GetChanges() 获取修改后的记录,不过后之是开启事务来进行处理,手动处理异常,这样就不会有你说的情况。
定义一个类似 BLL.Update(datatable) 这样的功能调用就行嘛。
如果客户端调用BLL也涉及回滚,那么你的客户端设计到底是数据库操作还是业务操作呢?例如说定旅行合同,结果在最后一步客户放弃了,那么这个回滚是业务逻辑,而不是什么数据库回滚。BLL根本没有什么数据库回滚这一说。如果说你“一句一句地执行的,现在需要回滚”,这说明你缺少作为一个业务而集中提交多个句子的BLL功能,是BLL接口设计缺乏必要的需求分析。而回滚之类的东西是在这个缺失的BLL功能内部的事情。
讨论的问题,修改DataTable后,怎么样将其写数据库……
即然是DataTable,肯定涉及到 Delete/Update/Insert等
这些操作,不可能在Bll中的某一个功能实现楼主困惑也在此,在三层中,同时做这些是比较麻烦……
想写一个对任意的DataTable有效的,比较麻烦! 楼主的重点也在些,怎么样符合三层思想(尽量方便的),解决DataTable写入DataBase的问题楼主是吧,呵呵,对于这个问题,我考虑的比较多……