你可以在不同的对象直接共享你的sqlconnection,这样就解决了另外一个方法是使用serviced component中的分布式事务,编程很简单,性能不如上面一种方法
解决方案 »
- C#GDI+绘制一个椭圆,如何判断某个点是否在椭圆上?
- c#操作access数据库
- 错误:写入锁定未经保持即被释放
- 如何学习?看什么方面的书籍?
- DataTable值比较问题
- C#读取Ini文件遇到的问题(急)!!!
- fastreport可以放在.net的控件集里吗,以后就可以像用控件那样的拖到窗体里
- 关于TcpListener如何侦听同一电脑的不同IP地址
- 如何解析远程地址,比如http://www.163.com,获取其IP?
- 我在调试程序的时候,运行结果总是一闪而过。我怎样才能看到结果?
- 《C#高级编程》此书的英文版叫《Professional C# (Beta 2 Edition)》!可见清华出版社用心之险恶!
- 如何创建ADDIN?用C#
我觉得这样的编程需求是很常见的,比如我在一个Project中定义了一个Class专门用来 操作数据,如方法
public DataTable GetTable(string sDbConStr,string sGetFieldSQL)
---通过传入连接字符串和查询的SQL语句,返回一个结果集public bool UpdateData(string sDbConStr,string sSQL)
---通过传入连接字符串和更新的SQL语句,来更新数据
这样的话我就不要在操作数据库中书写大片重复的代码来操作数,而直需一条SQL就可以了
但这样我就碰到了上面的关于事物的操作!
特别,我在一个Form上保存一个结果时需要保存两个表,一个表的保存是在这个Form中完成的,但是另一个表的保存我却是调用放在此Form上的一个自己写的UserControl的Save方法来保存的,怎么把对这两个表的操作封装到一个数据库事物中呢? 急需解决
你说的serviced component我不知道是各什么东东,但
共享sqlconnection是可以,但cmdPub.Transaction = myTrans还是没办法设置啊除非你让我把cmdPub共享,这样也不好吧!另外 共享sqlconnection也是不可行的,比如我上面说的在UserControl中的数据库操作 ,
我觉得可以只样
public DataTable GetTable(string sDbConStr,string sGetFieldSQL)
{
//开始事务
//运行
//提交事务
}
我要在一个保存操作中要更新三个不同的Table——执行三次更新语句(Update) 这三个Update对应的更新语句分别为 UpdSQl1,UpdSQl2,UpdSQl3
则我在保存事件中必须 连续三次调用Class的UpdateData方法
Procedure Void Save(sDbConStr)
{
UpdateData(sDbConStr,UpdSQl1);
UpdateData(sDbConStr,UpdSQl2);
UpdateData(sDbConStr,UpdSQl3);}
请问如何解决!?不要叫我修改CLass的UpdateData的方法,然后使此方法能一次传入一个SQL语句数组(比如把上面的UpdSQl1,UpdSQl2,UpdSQl3做为一个字符书数组传入)
然后在UpdateData中定义事物,并逐个取出UpdSQl3执行。
产生连接CNN
BEGIN传给模块SAVE(CNN,SAVEDATASTRING,......)
.
.
.
.
END
把UpdateData(string sDbConStr,string sSQL)改为UpdateData(数据连接对象 cnnObject,string sSQL)
{
if (aTrans.Connection == ConnectionState.Closed)
{
aTrans.Connection.Open();
} Try
{
SqlCommand cmd = new SqlCommand(aSqlStr, aTrans.Connection, aTrans);
cmd.ExecuteNonQuery();
//这里不要提交事物
}
catch(Exception e)
{
throw e;
//这里不要rollback
}
}
以上是方法ok,以下是在类中的调用public void AddItem(Item aItem)
{
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
SqlTransaction aTrans = conn.BeginTransaction(IsolationLevel.ReadCommited, "AddItem");try
{
string aSqlStr = "";//要提交的语句 Util.Execute(aSqlStr, aTrans); aSqlStr= "";//更多现一事物中的sql
Util.Execute(aSqlStr, aTrans); aTrans.Commit();//提交
}
catch(Exception e)
{
aTrans.RollBack("AddItem");
throw e;
}
finally
{
conn.Close();
}
}这样可以保证所有该方法内的提交在同事务中,不会出现问题。以上仅个人之见,请指正,不适用于有参数的SqlCommand, sql
Delphi这样就可以了!
我也想这样Ok
这不简单么
你可以过载
UpdateData(string sDbConStr, string sSQL, SqlTranasaction aTrans)只要aTrans是统一的,他们就一定在同一个事物内,你的为什么不行,如果你的UpdateData方法调一下提交一下,你又怎么能保证他们多次执行在同事务下,我的方法已经在实际中大量应用,决没有问题.
收益非浅! 非常感谢!