我试图了解这个选择有什么问题。 我想获得最后添加的user_Id。
以下是错误消息: 参数化查询'(@Id_user int)SELECT SCOPE_IDENTITY()AS id_user'需要参数'@Id_user',这是未提供的。
这是SQL语句:
if (count >= 1) /* <=== verification from the insert SQL */
{
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/Welcome.aspx");
}
}
catch (SqlException ex)
{
lblMessage.Text = ex.Message;
}
finally
{
sqlConnection.Close();
}
答案 0 :(得分:4)
你没有在你的sql语句中定义一个@parameter,所以你根本不需要添加参数 - 只需获取ExecuteScalar的结果 - 你应该能够将它转换为int - 虽然我把它投了特别是在sql语句中 -
select cast(Scope_identity() as int) ....
所以你最终会得到像
这样的东西 string selectStatement = "SELECT cast(SCOPE_IDENTITY() AS int)";
SqlCommand selectCommand = new SqlCommand(selectStatement, sqlConnection);
object newIDobj = (int)selectCommand.ExecuteScalar();
if(newIDobj!=null)
Session["Id_user"] = (int)newIDobj;
更好的是,你可以创建一个存储过程并在那里完成插入,然后它可以返回范围标识。
编辑包含插入示例。 (只是输入这里 - 很可能是一些拼写错误)
int newID = -1;
string commandString = "insert (code, desc, numbervalue) values (@code, @desc,@numbervalue); select cast(scope_identity() as int);"
using(SqlCommand cmd = new SqlCommand(commandString))
{
try
{
cmd.Parameters.Add("@code", )
// etc
int newid=(int)(cmd.ExecuteScalar()??-1);
}
catch(Exception e)
{
// something went wrong
}
}
if(newID!=-1)
{
// do something;
}