ADO.NET多数据库事务问题? 根据客户需要,一定要使用多数据库.现在有问题就是...在流程中会同时操作2个数据库...有什么办法可以同事对2个数据库进行事务.? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你可以用存储过程来实现或者就是用ADO。NET事务下面是ADO.NET事务同时操作两个表的例子SqlTransaction objTrans = sqlconn.BeginTransaction(); try { cm=sqlconn.CreateCommand(); cm.CommandType=CommandType.Text; cm.CommandText="insert into OrderList(User_Name,Order_Date,Order_Price)"+ "values(@User_Name,@Order_Date,@Order_Price)"+ "select @@IDENTITY AS 'id'"; cm.Parameters.Add("@User_Name",SqlDbType.NVarChar,50); cm.Parameters.Add("@Order_Date",SqlDbType.DateTime,8); cm.Parameters.Add("@Order_Price",SqlDbType.Money,8); cm.Parameters["@User_Name"].Value=username; cm.Parameters["@Order_Date"].Value=DateTime.Now.ToShortDateString(); cm.Parameters["@Order_Price"].Value=cart.TotalPrice; cm.Transaction=objTrans; int id=Convert.ToInt32(cm.ExecuteScalar()); cm.CommandText="insert into OrderItem(Order_Id,Goods_Id,Goods_Quantity,Unit_Cost)"+ "values(@Order_Id,@Goods_Id,@Goods_Quantity,@Unit_Cost)"; cm.Parameters.Add("@Order_Id",SqlDbType.Int,4); cm.Parameters.Add("@Goods_Id",SqlDbType.Int,4); cm.Parameters.Add("@Goods_Quantity",SqlDbType.Int,4); cm.Parameters.Add("@Unit_Cost",SqlDbType.Money,8); foreach(object obj in OrderHashtable) { GoodsOrder goodorder=(GoodsOrder)obj; cm.Parameters["@Order_Id"].Value=id; cm.Parameters["@Goods_Id"].Value=goodorder.Goods_ID; cm.Parameters["@Goods_Quantity"].Value=goodorder.Goods_Quantity; cm.Parameters["@Unit_Cost"].Value=goodorder.Sub_Total; cm.ExecuteNonQuery(); } objTrans.Commit(); return id; } catch { objTrans.Rollback(); int id=-1; return id; } TO: lcj_ABC(luochangjin)呵呵..是啊...要的是2个数据库....一个数据库这样可以实现...TO: yaopeng117(尋找屬於自己的道,堅定不移的走下去。)我知道可以用存储过程...可是现在问题就是要在前端实现...T_T SqlTransaction objTrans1 = sqlconn.BeginTransaction(); //数据库1SqlTransaction objTrans2 = sqlconn.BeginTransaction(); //数据库2try{ //进行数据库操作 objTrans1.Commit(); objTrans2.Commit();}catch{ objTrans1.Rollback(); objTrans2.Rollback();}这段代码没验证过,只要在Commit()时,不会出现错误的话,这段代码应该是能实现你的功能。 以我所知,目前要真正實現對多個數據庫,乃至多個不同服務器(或是MSSQL實體)上的數據庫實現事務,只有用COM+才能實現. SqlTransaction objTrans1 = sqlconn.BeginTransaction(); //数据库1SqlTransaction objTrans2 = sqlconn.BeginTransaction(); //数据库2try{ //进行数据库操作 objTrans1.Commit(); objTrans2.Commit();}catch{ objTrans1.Rollback(); objTrans2.Rollback();}这段代码没验证过,只要在Commit()时,不会出现错误的话,这段代码应该是能实现你的功能。 应当用自动事务(也就是分布式事务)分布式事务可以支持多数据库,还支持数据库和消息队列的事务.参考msdn:ms-help://MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconautomatictransactionsnetframeworkclasses.htm lcy00(lcy) 的方法不一定行吧的,当执行objTrans2.Commit()失败后(比如网络问题),无法回滚objTrans1,因为这个时候objTrans1已经提交了. 嗯...lcy00(lcy) 我也想到过...可是还是有漏洞的....万一数据弄错..要赔大了..T_T 怎么你不相信吗?应当用自动事务(也就是分布式事务)分布式事务可以支持多数据库,还支持数据库和消息队列的事务.参考msdn:ms-help://MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconautomatictransactionsnetframeworkclasses.htm 如果仅仅利用事务,要想保证绝对稳定,应该不可能的。因为会有可能出现无法解决的异常的。首先,两个数据库的commit一定会有先后顺序。例如,A库commit成功,接着commit B库这时,commitB库失败,无论是什么原因引起的,由于A库存的commit已经成功,那么,A库已经没有rollback的余地了。建议把软件用两个数据库的原因,和两个数据库之间的关系写出来,大家都想想办法。 具体原因是因为老板要把大工程分成小工程....其实一个数据库可以解决但没办法.....要跟着组织走啊.....谢谢大家的支持....最感谢的是 xxc1981(asf) ...最后还是用你给的分布式事务方法实现了...*^_^* 原来这个问题只有1、2个人答对啊,要用“分布式事务”,也就是“二次提交”啦,也就是说用COM+(其实是MTS),也就是把你的.net类写成COM+组件,也就在.net类上应用EnterpriceServiceAttribute也就是到Help上查一查该属性,也就是知道了吧! 使用wpf打印xps时候如何禁止打印到文件 datagrid中如何实现翻页,或滚条呀 菜鸟提问:关于FileUpload的问题 没有编程基础如何学习数据库开发 C# directshow 问题 怎么制作浏览量?? 关于winform窗体关闭的问题 在C#中如何得到汉字的首字母? 拼音如何转汉字? 怎样把已经有很多内容的DropDownList列表定位到某一项 如何利用datagird控件显示主从关系数据表 StringReader类有什么用处?能据个具体例子吗?
或者就是用ADO。NET事务
下面是ADO.NET事务同时操作两个表的例子
SqlTransaction objTrans = sqlconn.BeginTransaction();
try
{
cm=sqlconn.CreateCommand();
cm.CommandType=CommandType.Text;
cm.CommandText="insert into OrderList(User_Name,Order_Date,Order_Price)"+
"values(@User_Name,@Order_Date,@Order_Price)"+
"select @@IDENTITY AS 'id'";
cm.Parameters.Add("@User_Name",SqlDbType.NVarChar,50);
cm.Parameters.Add("@Order_Date",SqlDbType.DateTime,8);
cm.Parameters.Add("@Order_Price",SqlDbType.Money,8); cm.Parameters["@User_Name"].Value=username;
cm.Parameters["@Order_Date"].Value=DateTime.Now.ToShortDateString();
cm.Parameters["@Order_Price"].Value=cart.TotalPrice;
cm.Transaction=objTrans;
int id=Convert.ToInt32(cm.ExecuteScalar());
cm.CommandText="insert into OrderItem(Order_Id,Goods_Id,Goods_Quantity,Unit_Cost)"+
"values(@Order_Id,@Goods_Id,@Goods_Quantity,@Unit_Cost)";
cm.Parameters.Add("@Order_Id",SqlDbType.Int,4);
cm.Parameters.Add("@Goods_Id",SqlDbType.Int,4);
cm.Parameters.Add("@Goods_Quantity",SqlDbType.Int,4);
cm.Parameters.Add("@Unit_Cost",SqlDbType.Money,8); foreach(object obj in OrderHashtable)
{
GoodsOrder goodorder=(GoodsOrder)obj;
cm.Parameters["@Order_Id"].Value=id;
cm.Parameters["@Goods_Id"].Value=goodorder.Goods_ID;
cm.Parameters["@Goods_Quantity"].Value=goodorder.Goods_Quantity;
cm.Parameters["@Unit_Cost"].Value=goodorder.Sub_Total;
cm.ExecuteNonQuery();
}
objTrans.Commit(); return id;
}
catch
{
objTrans.Rollback();
int id=-1;
return id;
}
呵呵..是啊...要的是2个数据库....一个数据库这样可以实现...TO: yaopeng117(尋找屬於自己的道,堅定不移的走下去。)
我知道可以用存储过程...可是现在问题就是要在前端实现...T_T
SqlTransaction objTrans2 = sqlconn.BeginTransaction(); //数据库2try
{
//进行数据库操作 objTrans1.Commit();
objTrans2.Commit();
}
catch
{
objTrans1.Rollback();
objTrans2.Rollback();
}这段代码没验证过,只要在Commit()时,不会出现错误的话,这段代码应该是能实现你的功能。
SqlTransaction objTrans2 = sqlconn.BeginTransaction(); //数据库2try
{
//进行数据库操作 objTrans1.Commit();
objTrans2.Commit();
}
catch
{
objTrans1.Rollback();
objTrans2.Rollback();
}这段代码没验证过,只要在Commit()时,不会出现错误的话,这段代码应该是能实现你的功能。
分布式事务可以支持多数据库,还支持数据库和消息队列的事务.
参考msdn:
ms-help://MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconautomatictransactionsnetframeworkclasses.htm
应当用自动事务(也就是分布式事务)
分布式事务可以支持多数据库,还支持数据库和消息队列的事务.
参考msdn:
ms-help://MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconautomatictransactionsnetframeworkclasses.htm
这时,commitB库失败,无论是什么原因引起的,由于A库存的commit已经成功,那么,A库已经没有rollback的余地了。建议把软件用两个数据库的原因,和两个数据库之间的关系写出来,大家都想想办法。
谢谢大家的支持....最感谢的是 xxc1981(asf) ...最后还是用你给的分布式事务方法实现了...*^_^*
要用“分布式事务”,也就是“二次提交”啦,也就是说用COM+(其实是MTS),
也就是把你的.net类写成COM+组件,也就在.net类上应用EnterpriceServiceAttribute
也就是到Help上查一查该属性,也就是知道了吧!