从检索查询单值(Retrieving single value from query)

2019-09-17 15:04发布

我试图检索一个表的整数值,基于字符串领域的用户名。 我使用一个存储过程,而直接文本尝试。 当我执行存储过程,获得正确的返回值; 但是,正确的结果不来通过。

下面是代码两组 - 直接的文字 -

public int GetUserRole(string CUSER)
{
    try
    {
        SQLCON = new SqlConnection(connectionString);
        SQLCON.Open();
        SQLCommand = new SqlCommand();
        SQLCommand.CommandType = CommandType.Text;
        SQLCommand.Parameters.Add("USUsername", SqlDbType.VarChar).Value = CUSER;
        SQLCommand.CommandText = "SELECT USRole FROM tblUser WHERE USUsername = CUSER";
        Int32 USRole = (Int32) SQLCommand.ExecuteScalar();

        return USRole;

    }
    catch
    {
        HttpContext.Current.Response.Redirect("~/ErrorRedirect.aspx", false);
        return 0;
    }
}

SQL查询:

ALTER PROCEDURE [dbo].[spGetUserRole]
-- Add the parameters for the stored procedure here
    @username VARCHAR(50)
AS
BEGIN
-- Declare the return variable here
DECLARE @USRole as int

-- Add the T-SQL statements to compute the return value here
SELECT @USRole = tblUser.USRole FROM tblUser WHERE USUsername = @username

-- Return the result of the function
RETURN @USRole  
END

Answer 1:

你是不是正确引用您的参数。 如果要添加一个名为USUsername参数,然后在命令文本,你应该使用@USUsername:

public int GetUserRole(string CUSER)
{
    try
    {
        SQLCON = new SqlConnection(connectionString);
        SQLCON.Open();
        SQLCommand = new SqlCommand();
        SQLCommand.CommandType = CommandType.Text;
        SQLCommand.Parameters.Add("USUsername", SqlDbType.VarChar).Value = CUSER;
        SQLCommand.CommandText = "SELECT USRole FROM tblUser WHERE USUsername = @USUsername";
        Int32 USRole = (Int32) SQLCommand.ExecuteScalar();

        return USRole;

    }
    catch (Exception)
    {
        HttpContext.Current.Response.Redirect("~/ErrorRedirect.aspx", false);
        return 0;
    }
}

存储过程还需要更新作为参数名在这里也应该匹配,你不需要返回变量。

ALTER PROCEDURE [dbo].[spGetUserRole]
-- Add the parameters for the stored procedure here
@USUsername VARCHAR(50)

AS
BEGIN

-- Add the T-SQL statements to compute the return value here
SELECT tblUser.USRole FROM tblUser WHERE USUsername = @USUsername

END

你也应该看看在使用“使用”语法自动关闭数据库连接。 参见Scott Hanselman的例子在这里- http://www.hanselman.com/blog/WhyTheUsingStatementIsBetterThanASharpStickInTheEyeAndASqlConnectionRefactoringExample.aspx



Answer 2:

我不知道你怎么称呼您的存储过程,但那里有在您发布查询的错误:

"SELECT USRole FROM tblUser WHERE USUsername = CUSER"

应改为

SQLCommand.Parameters.Add("@USUsername", SqlDbType.VarChar).Value = CUSER;
"SELECT USRole FROM tblUser WHERE USUsername = @USUsername"


您目前尚未实拍查询参数部分,但试图找到该列中的值CUSER



Answer 3:

除了使用存储过程(返回值的RETURN @USRole ),背部使用SELECT语句(如发送结果Select @USRole )。 这是怎么回事是一个存储过程的返回值是不一样的东西是使用的ExecuteScalar。 的ExecuteScalar返回输出的第一列和行。 返回值是不同的,而且必须使用特别命名的参数访问@RETURN_VALUE或特殊ParameterDirection.ReturnValue财产。

你的程序的修订版将如下所示:

ALTER PROCEDURE [dbo].[spGetUserRole]
-- Add the parameters for the stored procedure here
@USUsername VARCHAR(50)

AS
BEGIN

-- Add the T-SQL statements to compute the return value here
Select tblUser.USRole 
FROM tblUser 
WHERE USUsername = @USUsername

END

RETURN(的Transact-SQL)

SqlCommand.ExecuteScalar方法



Answer 4:

正确地使用参数。 不要忘记,收于finally语句连接。

 public int GetUserRole(string CUSER)
    {
        try
        {
            SQLCON = new SqlConnection(connectionString);
            SQLCON.Open();
            SQLCommand = new SqlCommand();
            SQLCommand.CommandType = CommandType.Text;
            SQLCommand.CommandText = "SELECT USRole FROM tblUser WHERE USUsername = @USUsername  ";
            SQLCommand.Parameters.Add("USUsername", SqlDbType.VarChar).Value = CUSER;

            Int32 USRole = (Int32) SQLCommand.ExecuteScalar();

            return USRole;

        }
        catch (Exception)
        {
            HttpContext.Current.Response.Redirect("~/ErrorRedirect.aspx", false);
            return 0;
        }
        finally { close connection here.. }

    }


Answer 5:

如果你坚持使用的返回值,你可以通过设置参数的方向和使用的ExecuteNonQuery做

SqlParameter p = cmd.Parameters.Add("@USRole", SqlDbType.Int);
p.Direction = ParameterDirection.ReturnValue;
cmd.ExecuteNonQuery(); 
int returnvalue = (int)cmd.Parameters["@USRole"].Value;

如果你想使用的ExecuteScalar那么就改变你的PROC来select的变量,而不是Return

你要注意,你放什么在参数名称是任意的。



文章来源: Retrieving single value from query