我想向用户表中添加数据(注册后)。在将用户数据添加到用户表后,我不想在'profile'表(1:1)中创建具有userID的行,这就是为什么我在这里使用事务。但问题是插入后,我无法获得用户ID的用户(@@标识)时,代码来“的ExecuteScalar()”行不同的是我收到的是"Object reference not set to an instance of an object."
从数据库中获取最后插入的ID的问题 - asp.net
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();
}
不要使用单独的查询来获取'@@ IDENTITY'。在原始查询中返回'SCOPE_IDENTITY()'。 –
所以我可以从'sqlAddUser'查询返回标识。你能提供一些实用的代码吗? – 1110
我刚刚注意到你正在使用串联构建你的查询。您应该立即停止并使用参数化查询,否则您的网站极有可能通过SQL注入被黑客入侵。然后,您将在参数化查询的末尾添加'; SELECT @newid = SCOPE_IDENTITY()'并传入该名称的输出参数。对不起,不能提供示例代码,因此评论无法回答。希望别人会! –