使用范围标识作为属性插入

时间:2015-07-22 16:10:32

标签: c# sql sql-server

创建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的最后一个异常捕获进行回滚?

1 个答案:

答案 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();
    }
}