使用Scope_Identity选择错误

时间:2014-01-27 20:31:10

标签: c# asp.net sql sql-server

我试图了解这个选择有什么问题。 我想获得最后添加的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();
    }

1 个答案:

答案 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;
}