Захват возвращаемого значения хранимой процедуры

Я пытаюсь реализовать поставщика пользовательских ролей для моего приложения .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. Может ли кто-нибудь указать мне, что вызывает такое поведение


person John x    schedule 10.01.2013    source источник
comment
дубликат stackoverflow.com/questions/5412256/   -  person Sebastian Meine    schedule 10.01.2013
comment
@SebastianMeine, но я не использую какой-либо класс, подобный SafeDataReader   -  person John x    schedule 10.01.2013
comment
У вас есть точка там...   -  person Sebastian Meine    schedule 10.01.2013


Ответы (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 = "/";

Вы передавали имя_роли в качестве параметра для имени приложения.

person Icarus    schedule 10.01.2013
comment
у меня нет слов, чтобы выразить свою благодарность ... да благословит вас бог @lcarus - person John x; 10.01.2013