我正在尝试将数据添加到User表(注册后)。在将用户数据添加到用户表后,我不想立即在'profile'表(1:1)中使用userID创建行,这就是我在这里使用事务的原因。但问题是,当代码到达'ExecuteScalar()'行异常时,我在插入(@@ Identity)后无法获得用户的UserId "Object reference not set to an instance of an object."
string sqlAddUser = string.Format("insert into tbl_users ([UserName],[Email],[Password],[PasswordSalt],[CreatedDate],[IsActivated],[IsLockedOut],[LastLoginDate],[LastLockedOutDate], [NewEmailKey]) values ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}', '{9}')",
user.UserName, user.Email, user.Password, user.PasswordSalt, user.CreatedDate, user.IsActivated, user.IsLockedOut, user.LastLockedOutDate, user.LastLoginDate, user.NewEmailKey);
SqlCommand cmdAddUser = new SqlCommand(sqlAddUser, conn, transaction);
int result = cmdAddUser.ExecuteNonQuery();
SqlCommand cmdGetLastIdentity = new SqlCommand("SELECT @@IDENTITY", conn, transaction);
int i = (int)cmdGetLastIdentity.ExecuteScalar();
string sqlAddUserProfile = string.Format("insert into tbl_profile (UserId) values ({0})", i);
SqlCommand cmdAddUserProfile = new SqlCommand(sqlAddUserProfile, conn, transaction);
cmdAddUserProfile.ExecuteNonQuery();
transaction.Commit();
return GetUser(username);
}
catch (Exception ex)
{
transaction.Rollback();
}
答案 0 :(得分:5)
您可以使用带有INSERT,UPDATE,DELETE或MERGE语句的OUTPUT子句在单个语句中执行此操作。
cmd.CommandText = "INSERT INTO tbl_user (...) OUTPUT inserted.Id VALUES (...)";
var id = Convert.ToInt32(cmd.ExecuteScalar());
您可以输出任何数据库生成的值,并使用SqlCommand.ExecuteReader()读取值,这将执行插入并输出插入的值作为表。
注意:不要使用字符串格式化,使用sql参数,否则你很容易受到sql注入
答案 1 :(得分:3)
其中一条评论是 - 如下所示构建您的插入内容并且您要求SQL注入。这是你应该做的:
var cmdAddUser = new SqlCommand(@"insert into tbl_users (
[UserName],
[Email],
[Password],
[PasswordSalt],
[CreatedDate],
[IsActivated],
[IsLockedOut],
[LastLoginDate],
[LastLockedOutDate],
[NewEmailKey])
values (@p1, @p2, @p3, @p4, @p4, @p6, @p7, @p8, @p9, @p10);
select SCOPE_IDENTITY();", conn, transaction);
cmdAddUser.Parameters.AddWithValue("@p1", user.UserName);
cmdAddUser.Parameters.AddWithValue("@p2", user.Email);
cmdAddUser.Parameters.AddWithValue("@p3", user.Password);
cmdAddUser.Parameters.AddWithValue("@p4", user.PasswordSalt);
cmdAddUser.Parameters.AddWithValue("@p5", user.CreateDate);
cmdAddUser.Parameters.AddWithValue("@p6", user.IsActivated);
cmdAddUser.Parameters.AddWithValue("@p7", user.IsLockedOut);
cmdAddUser.Parameters.AddWithValue("@p8", user.LastLoginDate);
cmdAddUser.Parameters.AddWithValue("@p9", user.LastLockedOutDate);
cmdAddUser.Parameters.AddWithValue("@p10", user.NewEmailKey);
var newId = (int)cmdAddUser.ExecuteNonQuery();
// Then proceed with your profile operations using the result
您可能已经这样做了,但我会将您的操作包装在using
语句中,以便正确处理数据库对象。
答案 2 :(得分:-1)
您必须在服务器上创建一个存储过程,该过程将插入新用户并返回其ID。