【发布时间】:2014-01-27 18:08:26
【问题描述】:
我正在尝试使用 SCOPE_IDENTITY 获取最后插入的 ID,但出现错误。 我正在使用 SQL Server 2012 和 Visual Studio Express 2013
这是我的代码
protected void PerformInscription(string sEmail, string sPassword,string sName)
{
bool buserIdAuthenticated = false;
string salt = null;
string passwordHash = pwdManager.GeneratePasswordHash(txtPassword.Text, out salt);
SqlConnection sqlConnection;
sqlConnection = new SqlConnection();
try
{
sqlConnection.ConnectionString = sqlDataSource1.ConnectionString;
string insertStatement = "INSERT INTO [User] "
+ "(email, hash, salt, name) "
+ "VALUES (@email, @hash, @salt, @name);"
+ "SELECT SCOPE_IDENTITY() AS id_user;";
SqlCommand insertCommand = new SqlCommand(insertStatement, sqlConnection);
insertCommand.Parameters.Add("@email", SqlDbType.VarChar, 50).Value = sEmail;
insertCommand.Parameters.Add("@hash", SqlDbType.VarChar, 50).Value = passwordHash;
insertCommand.Parameters.Add("@salt", SqlDbType.VarChar, 50).Value = salt;
insertCommand.Parameters.Add("@nom", SqlDbType.VarChar, 50).Value = sName;
sqlConnection.Open();
int count = insertCommand.ExecuteNonQuery();
int User_ID = Convert.ToInt32(insertCommand.Parameters["@id_user"].Value);
Session["Id_user"] = User_ID;
insertCommand.Dispose();
if (count >= 1)
{
buserIdAuthenticated = true;
Session["userIdAuthenticated"] = buserIdAuthenticated;
Response.Redirect("../pages/Welcome.aspx");
}
}
catch (SqlException ex)
{
lblMessage.Text = ex.Message;
}
finally
{
sqlConnection.Close();
}
}
}
我想捕获最后一个 user_id,它被定义为自动增量的身份。
这是我得到的错误
“System.IndexOutOfRangeException”类型的异常发生在 System.Data.dll,但未在用户代码中处理。
附加信息:带有 ParameterName '@id_user' 的 SqlParameter 不包含在此 SqlParameterCollection 中。
我决定拆分这两个请求。 1 个插入和 1 个选择
SqlConnection sqlConnection;
sqlConnection = new SqlConnection();
try
{
sqlConnection.ConnectionString = sqlDataSource1.ConnectionString;
string insertStatement = "INSERT INTO [User] "
+ "(email, hash, salt, name) "
+ "VALUES (@email, @hash, @salt, @name)";
SqlCommand insertCommand = new SqlCommand(insertStatement, sqlConnection);
insertCommand.Parameters.Add("@email", SqlDbType.VarChar, 50).Value = sEmail;
insertCommand.Parameters.Add("@hash", SqlDbType.VarChar, 50).Value = passwordHash;
insertCommand.Parameters.Add("@salt", SqlDbType.VarChar, 50).Value = salt;
insertCommand.Parameters.Add("@name", SqlDbType.VarChar, 50).Value = sName;
sqlConnection.Open();
int count = insertCommand.ExecuteNonQuery();
insertCommand.Dispose();
if (count >= 1)
{
string selectStatement = "SELECT SCOPE_IDENTITY() AS id_user";
SqlCommand selectCommand = new SqlCommand(selectStatement, sqlConnection);
selectCommand.Parameters.Add("@Id_user", SqlDbType.Int, 0, "Id_user");
int newID = (int)selectCommand.ExecuteScalar();
int User_ID = Convert.ToInt32(selectCommand.Parameters["@Id_user"].Value);
Session["Id_user"] = User_ID;
buserIdAuthenticated = true;
Session["userIdAuthenticated"] = buserIdAuthenticated;
Response.Redirect("../pages/Bienvenue.aspx");
}
}
catch (SqlException ex)
{
lblMessage.Text = ex.Message;
}
finally
{
sqlConnection.Close();
}
}
}
【问题讨论】:
-
SCOPE_IDENTIY!=SCOPE_IDENTITY -
我没有看到参数中定义的
@id_user,你也应该将它声明为输出参数。在这里查看一些信息:msdn.microsoft.com/en-us/library/59x02y99(v=vs.110).aspx -
This 可能会有所帮助。
-
你能重新打开这个问题吗,因为我用新问题重写了标题,谢谢
-
@JoachimIsaksson 我正在尝试找到提取 scope_Identity() 的好答案;我添加了以下行“SELECT SCOPE_IDENTITY() AS id_user;”; insertCommand.Parameters.Add("@id_user", SqlDbType.Int,0,"Id_user");但我有这个错误参数化查询'(@email varchar(50),@hash varchar(50),@salt varchar(50),@name'需要参数'@id_user',它没有提供。任何想法?
标签: c# asp.net sql-server-2012