0

.Net アプリケーションにカスタム ロール プロバイダを実装しようとしています。Asp.NET のロール プロバイダー ストアド プロシージャを使用して、ユーザーが追加したロールが既に db に存在するかどうかを確認しようとしています。

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 = "/";

ApplicationName のパラメータとして roleName を渡していました。

于 2013-01-10T14:46:05.843 に答える