0

我正在尝试为我的 .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。任何人都可以指导我导致这种行为的原因

4

1 回答 1

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 的参数传递。

于 2013-01-10T14:46:05.843 回答