问大家个问题
我在用SqlDataAdapter更新数据库的时候,如果出现并发的情况会有许多相同的数据,怎么处理啊
我在用SqlDataAdapter更新数据库的时候,如果出现并发的情况会有许多相同的数据,怎么处理啊
解决方案 »
- c# 手动POST 数据到网站 登陆http的正常,https的就错误:无法连接到远程服务器
- 求c#写的通风网络解算程序,如何编写算法程序获得独立回路
- 总是觉得自己做的winform界面不好,大家都是怎么做的?
- DataGridView二维表头且支持排序的问题?
- 用GridView怎么实现二维录入数量
- 存储过程-表-累加(有没有更好的方法)
- DataGridView中当拖动行或列宽时(就是说调整纵列宽度时)发生那个事件
- 在C#中实现右键弹出菜单写出源代码立刻给分!小弟在此先谢谢各位大虾!!!
- 如何在keydown事件里面调用paint事件
- 程序在域工作组下可以正常运行,但是到了域控制器的机器下就不能运行了!!!!!!!!
- 无法将类型为Microsoft.office.interop.Excel.ApplicationClass的COM对象强制软件为Microsoft.office.interop.Excel._Application
- 海量群发邮件的问题
长相问题.性欲:15
长相问题.性欲:15
----------------------------------------
那是我删自己帖子给扣的分,不会不给各位分数的,留着又不能变钱
SqlConnection scon = new SqlConnection("server=;uid=sa;pwd=123;database=aaa");
SqlDataAdapter da = new SqlDataAdapter("select * from ccc", scon);
SqlCommandBuilder cb = new SqlCommandBuilder(da);
scon.Open();
da.Update(ds, "ccc");
scon.Close();用SqlCommandBuilder 实现批量更新 1.功能: 可以实现你对DataSet在UI层做任意操作后,直接丢给这个方法,这个方法就可以自动把你的修改更 新到数 据库中,而没必要每次都更新到 数据库 2.使用方法
public DataSetUpdateByDataSet(DataSet ds,string strTblName,string strConnection)
{
SqlConnection conn = new SqlConnection(strConnection));
SqlDataAdapter myAdapter = new SqlDataAdapter();
SqlCommand myCommand = new SqlCommand("select * from "+strTblName),(SqlConnection) conn);
myAdapter.SelectCommand = myCommand;
SqlCommandBuilder myCommandBuilder = new SqlCommandBuilder(myAdapter);
try { lock(this) //处理并发情况(分布式情况) { myAdapter.Update(ds,strTblName); } }
catch(Exception err)
{ conn.Close();
throw new BusinessException(err);
} return ds; //数据集的行状态在更新后会都变为: UnChange,在这次更新后客户端要用返回的ds } 或 public DataSet UpdateByDataSet(DataSet ds,string strTblName,string strConnection)
{
SqlConnection conn = new SqlConnection(strConnection));
SqlCommand myCommand = new SqlCommand("select * from "+strTblName),(SqlConnection) conn); SqlDataAdapter myAdapter = new SqlDataAdapter(myCommand ); SqlCommandBuilder myCommandBuilder = new SqlCommandBuilder(myAdapter);
myAdapter.InsertCommand = myCommandBuilder .GetInsertCommand(); myAdapter.UpdateCommand = myCommandBuilder .GetUpdateCommand(); myAdapter.DeleteCommand = myCommandBuilder .GetDeleteCommand(); try { lock(this) //处理并发情况(分布式情况) { conn.Open(); myAdapter.Update(ds,strTblName); conn.Close(); }
return ds; //数据集的行状态在更新后会都变为: UnChange,在这次更新后客户端要用返回的ds }
catch(Exception err)
{ conn.Close();
throw new BusinessException(err);
}
} 直接调用这两个方法的任意一个就OK啦,说明的一点是select * from "+strTblName是一定要的,
作用大家也应该想到了,主要是告诉 SqlDataAdapter更新哪个表
3.什么时候用? a. 有时候需要缓存的时候,比如说在一个商品选择界面,选择好商品,并且进行编辑/删除/更新后, 最后一并交给数据库,而不是每一步操作都访问数据库,因为客户选择商品可能进行n次编辑/删除 更新操作,如果每次都提交,不但容易引起数据库冲突,引发错误,而且当数据量很大时在用户执行 效率上也变得有些慢 b.有的界面是这样的有的界面是这样的,需求要求一定用缓存实现,确认之前的操作不提交到库,点击 页面专门提交的按钮时才提交商品选择信息和商品的其它信息. 我经常遇到这样的情况 c.有些情况下只往数据库里更新,不读取. 也就是说没有从数据库里读,SqlDataAdapter也就不知道是
更新哪张表了,调用Update就很可能出错了。这样的情况下可以用SqlCommandBuilder 了.
4.
注意点:
1.只能更新一个表,如果此数据集是从两个或者两个以上的表关联而来的,则不能用此方法自动更新
2.表中必须设置主键
3.更新的表中字段不能有image类型的 5.优点: 节省代码量,节省时间,这个方法可以代替所有的: 更新/删除/插入操作语句 6.缺点:
访问两次数据库(select * TableName,就是这句,要确认是哪个表,除非是很大的数据量,
一般是感觉不到的),效率稍微有些慢
怎么会呢? 在SQL中增删改 是隐式事物。 有独占锁定的。
yuewh491(帅的惊动了党) ( ) 信誉:15
长相问题.性欲:15
----------------------------------------
那是我删自己帖子给扣的分,不会不给各位分数的,留着又不能变钱
-----------------
我也删了自己好多贴呢
我靠,这种性欲,不行
其次:sqldataadapter.update可以采用并发锁吗?