9

我正在尝试根据字符串字段用户名从单个表中检索整数值。我已经尝试过使用存储过程和直接文本。当我执行存储过程时,我得到了正确的返回值;然而,正确的结果并没有出现。

这是两组代码 - 直接文本 -

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
4

5 回答 5

16

您没有正确引用您的参数。如果要添加一个名为 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

于 2012-05-30T16:32:41.347 回答
1

不使用存储过程的返回值 ( 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

返回(事务处理 SQL)

SqlCommand.ExecuteScalar 方法

于 2012-05-30T16:26:48.827 回答
1

我不知道您是如何调用存储过程的,但是您发布的查询中有一个错误:

"SELECT USRole FROM tblUser WHERE USUsername = CUSER"

应该替换为

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


您目前并没有真正将参数作为查询的一部分,而是试图在列中找到值 CUSER

于 2012-05-30T16:27:49.963 回答
0

正确使用参数。并且不要忘记在 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.. }

    }
于 2012-05-30T16:26:58.123 回答
0

如果您坚持使用返回值,您可以通过设置参数方向并使用 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

您应该注意,您为参数名称输入的内容是任意的。

于 2012-05-30T16:33:01.460 回答