2015-07-22 2 views
3

При создании 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

Создайте хранимую процедуру, которая делает все это за одну транзакцию. Один из них терпит неудачу. – mxix

+1

+1 к сохраненному подходу proc. Как другой подход, что уникально для таблицы пользователя? 'Email'? Если это так, вы можете изменить инструкцию 'INSERT INTO User_Role' для' select User_Id от пользователей, где Email = @ Email'. Если пользовательская вставка не удалась, значит, что 'Email' не будет в пользовательской таблице, поэтому не вставлять какие-либо данные в таблицу соединений роли. –

+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(); 
    } 
} 
+0

Пробовал создавать хранимую процедуру и работал. Никогда не думал об этом, так как я никогда не использовал/не создал. Хотя я смогу использовать транзакцию в других областях. –

Смежные вопросы