[已解决问题] 一个ado.net的事务问题~~~
提问时间: 2007-11-20 13:40
悬赏分:50 浏览:446 次
问题如下:
需要对2个表一个音乐专辑表A,一个专辑曲目表B进行操作~步骤:
1.插入新数据到A表中。2.根据插入数据所生成的ID主键(自增长)对该行中的一个字段进行更新。3.根据上面的ID添加表B,B表3个主要字段,对应专辑ID(也就是插入数据所生成的ID主键),曲目名称,曲目URL,(曲目名称和曲目URL都是通过AJAX的POST方法传递,用户添加的个数不能确定,也就是可能N个曲目)。数据添加完成后同时生成HTML静态文件(其中存放路径的构成需要用到ID,要对ID进行MD5),所有动作都需要在一个事物里面完成。
现在的问题是:
如何在一个事务里面完成。
因为以前有些简单的,参数可以确定的,可以用存储过程来实现~现在需要在.cs代码中实现。
我说下我的实现方法。
1.首先,我设计了一个TransHelper类,如下:
 public class TransHelper
    {
        private SqlTransaction _Tranaction = null;
        private SqlConnection _Connection = null;

        public void BeginTranaction(SqlConnection SConnection)
        {
            _Connection = SConnection;
            _Connection.Open();
            _Tranaction = _Connection.BeginTransaction();
        }

        public void BeginTranaction(string ConnectionString)
        {
            _Connection = new SqlConnection(ConnectionString);
            _Connection.Open();
            _Tranaction = _Connection.BeginTransaction();
        }

        public SqlTransaction Tranaction
        {
            get
            {
                return _Tranaction;
            }
        }

        public SqlConnection Connection
        {
            get
            {
                return _Connection;
            }
        }
 &nbs
提问者:marxTen - 初学一级

问题补充: 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

最佳答案
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的数据库也一样适用.
2007/11/20 21:17:40 回答者:John Huang
其它回答(2)
还需提供CommitTransaction和RollbackTransaction方法. 建议使用SqlHelper,它已提供了封装.
10个月前   回答者:Anders Cui - 小虾三级
Enterprise Library Or 使用GUID~~~等非自增主键~~恨死自增主键了.
10个月前   回答者:沙加 - 老鸟四级
评论
   您需要登录以后才能回答!
 

我要提问

我的问题


快到期问题

> 问题排行榜

相关内容

相关链接