创建User
时,我需要给它一个系统Role
,所以我想知道最好的方法是什么。
我有解决方案,但我不确定这是否是最佳方式。
using (SqlConnection con = new SqlConnection(conString))
{
con.Open();
using (SqlCommand cmd = new SqlCommand(@"INSERT INTO Users (Name, Email, Username, Password, Active) VALUES (@Name, @Email, @Username, @Password, @Active); SELECT SCOPE_IDENTITY();", con))
{
try
{
cmd.Parameters.AddWithValue("@Name", user._Name);
cmd.Parameters.AddWithValue("@Email", user._Email);
cmd.Parameters.AddWithValue("@Username", user._Email);
cmd.Parameters.AddWithValue("@Password", user.Password);
cmd.Parameters.AddWithValue("@Active", 1);
user_id = Convert.ToInt32(cmd.ExecuteScalar());
//cmd.ExecuteNonQuery();
}
catch (SqlException)
{
//Handle Exception
}
}
}
using (SqlConnection con = new SqlConnection(conString))
{
using (SqlCommand cmd = new SqlCommand("INSERT INTO User_Role (User_Role_User_Id, User_Role_Role_Id) VALUES (@User_ID, @Role_ID)", con))
{
try
{
cmd.Parameters.AddWithValue("@User_ID", user_id);
cmd.Parameters.AddWithValue("@Role_ID", user.Role_ID);
cmd.ExecuteNonQuery();
}
catch (SqlException)
{
//Handle Exception
}
}
}
现在我的问题是,如果由于某种原因添加角色出错,我将创建一个没有角色的用户。
所以我想知道是否有可能加入这两个SqlCommand
,考虑到我需要Scope_Identity
插入User_Role
。或者对两个Insert的最后一个异常捕获进行回滚?
答案 0 :(得分:3)
将一个存储过程作为一个原子单元,或者如果你不能这样做,你可以将整个代码块包装在一个事务中,如果你继续使用相同的连接,如下所示:
using (SqlConnection con = new SqlConnection(conString))
{
con.Open();
var transaction = con.BeginTransaction();
try
{
//Run first command
//Run second command
//If we have succeeded, commit the transaction
transaction.Commit();
}
catch()
{
//Something went wrong, roll back
transaction.Rollback();
}
}