我试图检索一个表的整数值,基于字符串领域的用户名。 我使用一个存储过程,而直接文本尝试。 当我执行存储过程,获得正确的返回值; 但是,正确的结果不来通过。
下面是代码两组 - 直接的文字 -
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
你是不是正确引用您的参数。 如果要添加一个名为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
我不知道你怎么称呼您的存储过程,但那里有在您发布查询的错误:
"SELECT USRole FROM tblUser WHERE USUsername = CUSER"
应改为
SQLCommand.Parameters.Add("@USUsername", SqlDbType.VarChar).Value = CUSER;
"SELECT USRole FROM tblUser WHERE USUsername = @USUsername"
您目前尚未实拍查询参数部分,但试图找到该列中的值CUSER
除了使用存储过程(返回值的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方法
正确地使用参数。 不要忘记,收于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.. }
}
如果你坚持使用的返回值,你可以通过设置参数的方向和使用的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
你要注意,你放什么在参数名称是任意的。