【发布时间】:2011-08-31 10:36:12
【问题描述】:
我正在尝试将数据添加到用户表(注册后)。将用户数据添加到用户表后,我不会立即在“配置文件”表 (1:1) 中创建带有用户 ID 的行,这就是我在这里使用事务的原因。但问题是当我收到的“ExecuteScalar()”行异常是"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();
}
【问题讨论】:
-
不要使用单独的查询来获取
@@IDENTITY。在原始查询中返回SCOPE_IDENTITY()。 -
所以我可以从“sqlAddUser”查询中返回身份。你能提供一些示例代码吗?
-
我刚刚注意到您正在使用串联构建查询。您应该立即停止此操作并使用参数化查询,否则您的网站极有可能通过 SQL 注入被黑客入侵。然后将
;SELECT @newid = SCOPE_IDENTITY()添加到参数化查询的末尾,并传入该名称的输出参数。抱歉不能提供示例代码,因此 cmets 不回答。希望其他人会! -
现在我只是构建查询以便稍后工作,我将添加参数。谢谢。
标签: c# asp.net sql-server database transactions