高分求解一个关于C#的事务处理问题,使用的是TransactionScope类 100
数据访问层有三个方法:publicboolExcuteCommand(stringsqlStr,SqlParameter[]param))——位于DBHelper类{tr...
数据访问层有三个方法:
public bool ExcuteCommand(string sqlStr, SqlParameter[] param))——位于DBHelper类
{
try
{
conn.Open();
SqlCommand cmd = new SqlCommand(sqlStr, conn);
cmd.Parameters.AddRange(param);
cmd.ExecuteNonQuery();
return true;
}
catch
{
return false;
}
finally
{
conn.Close();
}
}
DBHelper dh = new DBHelper();
public bool AddUser(string userName, string userPassword)——位于UserDAL类
{
string sqlStr = "insert into TB_User values(@UserName,@UserPassword,@UserType)";
SqlParameter[] param = new SqlParameter[]
{
new SqlParameter("@UserName",userName),
new SqlParameter("@UserPassword",userPassword),
new SqlParameter("@UserType","一般用户"),
};
bool b = dh.ExcuteCommand(sqlStr, param);
return b;
}
public bool AddUserInfo(string userName))——位于UserDAL类
{
string sqlStr = "insert into TB_UserInfo values(@UserName,@Name,@Hometown,@PhoneNumber,@EMail)";
SqlParameter[] param = new SqlParameter[]
{
new SqlParameter("@UserName",userName),
new SqlParameter("@Name",""),
new SqlParameter("@Hometown",""),
new SqlParameter("@PhoneNumber",""),
new SqlParameter("@EMail",""),
};
bool b = dh.ExcuteCommand(sqlStr, param);
return b;
}
业务逻辑层使用下面的方法进行事务处理,但当发生异常时无法回滚,即当第二个表添加失败时,第一个表仍成功:
public bool AddUserToTwoTable(string userName, string userPassword)
{
using (TransactionScope ts = new TransactionScope())
{
UserDAL ud = new UserDAL();
bool b1 = ud.AddUser(userName, userPassword);
bool b2 = ud.AddUserInfo(userName);
ts.Complete();
if (b1 && b2)
{
return true;
}
else
{
return false;
}
}
}
请问是为什么?谢谢!解决问题再追加100分!
我知道是分层开发产生的问题,如果这些代码写在同一个类中,事务处理是可以正常进行的,我现在就是想在分层开发的前提下,不适用存储过程,而使用.NET的事务处理解决问题,望高手指教,万分感谢。
1楼的仁兄:我的事物是在业务逻辑层的,没有用在访问层和应用层,也没有在应用层写新的方法,主要是考虑分层结构的严谨性,不想把SQL语句带到逻辑层和应用层,也不想在访问层执行事务这样的逻辑。
2楼的兄弟:在应用层写方法,意味着应用层将出现SQL语句,我不想这么做,应为严格上讲只有数据访问层可出现SQL语句。 展开
public bool ExcuteCommand(string sqlStr, SqlParameter[] param))——位于DBHelper类
{
try
{
conn.Open();
SqlCommand cmd = new SqlCommand(sqlStr, conn);
cmd.Parameters.AddRange(param);
cmd.ExecuteNonQuery();
return true;
}
catch
{
return false;
}
finally
{
conn.Close();
}
}
DBHelper dh = new DBHelper();
public bool AddUser(string userName, string userPassword)——位于UserDAL类
{
string sqlStr = "insert into TB_User values(@UserName,@UserPassword,@UserType)";
SqlParameter[] param = new SqlParameter[]
{
new SqlParameter("@UserName",userName),
new SqlParameter("@UserPassword",userPassword),
new SqlParameter("@UserType","一般用户"),
};
bool b = dh.ExcuteCommand(sqlStr, param);
return b;
}
public bool AddUserInfo(string userName))——位于UserDAL类
{
string sqlStr = "insert into TB_UserInfo values(@UserName,@Name,@Hometown,@PhoneNumber,@EMail)";
SqlParameter[] param = new SqlParameter[]
{
new SqlParameter("@UserName",userName),
new SqlParameter("@Name",""),
new SqlParameter("@Hometown",""),
new SqlParameter("@PhoneNumber",""),
new SqlParameter("@EMail",""),
};
bool b = dh.ExcuteCommand(sqlStr, param);
return b;
}
业务逻辑层使用下面的方法进行事务处理,但当发生异常时无法回滚,即当第二个表添加失败时,第一个表仍成功:
public bool AddUserToTwoTable(string userName, string userPassword)
{
using (TransactionScope ts = new TransactionScope())
{
UserDAL ud = new UserDAL();
bool b1 = ud.AddUser(userName, userPassword);
bool b2 = ud.AddUserInfo(userName);
ts.Complete();
if (b1 && b2)
{
return true;
}
else
{
return false;
}
}
}
请问是为什么?谢谢!解决问题再追加100分!
我知道是分层开发产生的问题,如果这些代码写在同一个类中,事务处理是可以正常进行的,我现在就是想在分层开发的前提下,不适用存储过程,而使用.NET的事务处理解决问题,望高手指教,万分感谢。
1楼的仁兄:我的事物是在业务逻辑层的,没有用在访问层和应用层,也没有在应用层写新的方法,主要是考虑分层结构的严谨性,不想把SQL语句带到逻辑层和应用层,也不想在访问层执行事务这样的逻辑。
2楼的兄弟:在应用层写方法,意味着应用层将出现SQL语句,我不想这么做,应为严格上讲只有数据访问层可出现SQL语句。 展开
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询