捕获存储过程的返回值

时间:2013-01-10 14:17:34

标签: asp.net sql-server asp.net-4.0 roleprovider

我正在尝试为我的.Net应用程序实现自定义角色提供程序。我试图通过使用Asp.NET的角色提供程序存储过程来检查用户添加的角色是否已经存在于数据库中,如

SqlConnection sqlConnection = new SqlConnection(conn);
SqlCommand sqlCommand = new SqlCommand("aspnet_Roles_RoleExists", sqlConnection);
sqlCommand.CommandType = CommandType.StoredProcedure;
sqlCommand.Parameters.Add("@RoleName", SqlDbType.VarChar, 256).Value = "/";
sqlCommand.Parameters.Add("@ApplicationName", SqlDbType.VarChar, 256).Value = roleName;
sqlCommand.Parameters.Add("@ReturnValue", SqlDbType.Int,4).Direction = ParameterDirection.ReturnValue;
try
{
  sqlConnection.Open();
  sqlCommand.ExecuteNonQuery();
  int x = (int)sqlCommand.Parameters["@ReturnValue"].Value;
  if ((int)sqlCommand.Parameters["@ReturnValue"].Value == 0)
                 ...

问题在于,当我添加角色,例如admin并从数据库手动运行sp,如

DECLARE @return_value int

EXEC    @return_value = [dbo].[aspnet_Roles_RoleExists]
        @ApplicationName = N'/',
        @RoleName = N'admin'

SELECT  'Return Value' = @return_value

它给了我正确的结果但是从应用程序中我尝试再次添加角色admin语句

(int)sqlCommand.Parameters["@ReturnValue"].Value

总是给我0。任何人都可以指导我导致这种行为的原因

1 个答案:

答案 0 :(得分:1)

这更可能是因为您反转了存储过程所期望的值:

sqlCommand.Parameters.Add("@RoleName", SqlDbType.VarChar, 256).Value = "/";
sqlCommand.Parameters.Add("@ApplicationName", SqlDbType.VarChar, 256).Value = roleName;

它应该是:

sqlCommand.Parameters.Add("@RoleName", SqlDbType.VarChar, 256).Value = roleName;
sqlCommand.Parameters.Add("@ApplicationName", SqlDbType.VarChar, 256).Value = "/";

您正在将roleName作为ApplicationName的参数传递。