首页 新闻 会员 周边

一个ado.net的事务问题~~~

0
悬赏园豆:50 [已解决问题] 解决于 2007-11-26 19:30
问题如下:<br>需要对2个表一个音乐专辑表A,一个专辑曲目表B进行操作~步骤:<br>1.插入新数据到A表中。2.根据插入数据所生成的ID主键(自增长)对该行中的一个字段进行更新。3.根据上面的ID添加表B,B表3个主要字段,对应专辑ID(也就是插入数据所生成的ID主键),曲目名称,曲目URL,(曲目名称和曲目URL都是通过AJAX的POST方法传递,用户添加的个数不能确定,也就是可能N个曲目)。数据添加完成后同时生成HTML静态文件(其中存放路径的构成需要用到ID,要对ID进行MD5),所有动作都需要在一个事物里面完成。<br>现在的问题是:<br>如何在一个事务里面完成。<br>因为以前有些简单的,参数可以确定的,可以用存储过程来实现~现在需要在.cs代码中实现。<br>我说下我的实现方法。<br>1.首先,我设计了一个TransHelper类,如下:<br>&nbsp;public class TransHelper<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private SqlTransaction _Tranaction = null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private SqlConnection _Connection = null;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void BeginTranaction(SqlConnection SConnection)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _Connection = SConnection;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _Connection.Open();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _Tranaction = _Connection.BeginTransaction();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void BeginTranaction(string ConnectionString)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _Connection = new SqlConnection(ConnectionString);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _Connection.Open();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _Tranaction = _Connection.BeginTransaction();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public SqlTransaction Tranaction<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return _Tranaction;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public SqlConnection Connection<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return _Connection;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbs
问题补充: public void CloseTranaction(bool IsSuccess) { if (_Tranaction != null) { if (IsSuccess) { _Tranaction.Commit(); } else { _Tranaction.Rollback(); } if (_Connection.State == ConnectionState.Open) { _Connection.Close(); } _Connection.Dispose(); } } } } 2.在aspx.cs里面的代码如下: int intMusicAlbumID = 0; using (CBase cbase = new CBase())//链接字符串的基类 { bool addMusic = false; t.BeginTranaction(cbase.ConnectionString); if (MusicAlbum.Add(Server.HtmlDecode(txtMusicAlbumContent.Text.Trim()), out intMusicAlbumID, t.Tranaction)) { if (MusicAlbum.UpdateCovAddrAndShtmlUrl()) { CB_MusicSpecialItem musicItem = new CB_MusicSpecialItem(); addMusic = musicItem.Add(); } }t.CloseTranaction(addMusic); } 说明: MusicAlbum.Add(Server.HtmlDecode(txtMusicAlbumContent.Text.Trim()), out intMusicAlbumID, t.Tranaction) 这个方法添加A表数据,返回主键ID(自增量),同时传递一个tranaction对象进去. 这个方法代码如下: public bool Add(string MusicAlbumContent,out int MusicAlbumID,SqlTransaction sTransaction) { SqlConnection conn; bool blnResult; MusicAlbumID = 0; if ((strConnectString != "")) { conn = new SqlConnection(strConnectString); try { conn.Open(); try { SqlCommand cmd = new SqlCommand("p_viktor_B_MusicSpecialAdd", conn); cmd.Transaction = sTransaction;//这里指定传递的transaction cmd.CommandType = CommandType.StoredProcedure; SqlParameter RETUR
marxTen的主页 marxTen | 初学一级 | 园豆:90
提问于:2007-11-20 13:40
< >
分享
最佳答案
0
http://www.cnblogs.com/Garnai/archive/2007/06/14/783551.html John.Commons.DBUtility for .NET 2.0(MS SQL 2005) 这个是我自己封装的DBUtility for mssql2005,也就是大家常说的SqlHelper,2000的数据库也一样适用.
黄铨 | 菜鸟二级 |园豆:350 | 2007-11-20 21:17
其他回答(2)
0
还需提供CommitTransaction和RollbackTransaction方法. 建议使用SqlHelper,它已提供了封装.
Anders Cui | 园豆:1570 (小虾三级) | 2007-11-20 13:51
0
Enterprise Library Or 使用GUID~~~等非自增主键~~恨死自增主键了.
沙加 | 园豆:3680 (老鸟四级) | 2007-11-21 20:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册