2009-12-04 3 views
0

나는 어려운 질문을하므로 나와 함께하시기 바랍니다.엔티티에 대한 예외 및 Linq

아래의 코드에서 프로그래머는 물리적 데이터 레이어로 인한 특정 오류 만 이벤트 로그에 투영하려고했기 때문에이 방법이 효과적입니다. 나머지는 스택 위로 더 밀려 나옵니다. OdbcException()을 catch 할 수 있기 때문입니다.

나는 내 자신의 MembershipProvider를 구현 중입니다. 그러나 Linq to Entities를 사용하고 있지만 이벤트 로그에 하위 수준/실제 수준 예외 만 보내고 싶습니다. 저 수준에서 잡을 수있게 해주는 엔티티에 Linq를 사용할 때 나는 잡을 수있는 예외가 있습니까?

아래에서 볼 수 있듯이 try 블록 내에서 발생하는 예외조차도 잡히지 않으므로 이벤트 로그로 보내지 않습니다.

어떻게 Linq에서 엔티티를 사용하여이 작업을 수행 할 수 있습니까?

코드 :

public override string ResetPassword(string username, string answer) 
{ 
if (!EnablePasswordReset) 
{ 
    throw new NotSupportedException("Password reset is not enabled."); 
} 

if (answer == null && RequiresQuestionAndAnswer) 
{ 
    UpdateFailureCount(username, "passwordAnswer"); 

    throw new ProviderException("Password answer required for password reset."); 
} 

string newPassword = 
    System.Web.Security.Membership.GeneratePassword(newPasswordLength, MinRequiredNonAlphanumericCharacters); 


ValidatePasswordEventArgs args = 
    new ValidatePasswordEventArgs(username, newPassword, true); 

OnValidatingPassword(args); 

if (args.Cancel) 
    if (args.FailureInformation != null) 
    throw args.FailureInformation; 
    else 
    throw new MembershipPasswordException("Reset password canceled due to password validation failure."); 


OdbcConnection conn = new OdbcConnection(connectionString); 
OdbcCommand cmd = new OdbcCommand("SELECT PasswordAnswer, IsLockedOut FROM Users " + 
    " WHERE Username = ? AND ApplicationName = ?", conn); 

cmd.Parameters.Add("@Username", OdbcType.VarChar, 255).Value = username; 
cmd.Parameters.Add("@ApplicationName", OdbcType.VarChar, 255).Value = pApplicationName; 

int rowsAffected = 0; 
string passwordAnswer = ""; 
OdbcDataReader reader = null; 

try 
{ 
    conn.Open(); 

    reader = cmd.ExecuteReader(CommandBehavior.SingleRow); 

    if (reader.HasRows) 
    { 
    reader.Read(); 

    if (reader.GetBoolean(1)) 
    throw new MembershipPasswordException("The supplied user is locked out."); 

    passwordAnswer = reader.GetString(0); 
    } 
    else 
    { 
    throw new MembershipPasswordException("The supplied user name is not found."); 
    } 

    if (RequiresQuestionAndAnswer && !CheckPassword(answer, passwordAnswer)) 
    { 
    UpdateFailureCount(username, "passwordAnswer"); 

    throw new MembershipPasswordException("Incorrect password answer."); 
    } 

    OdbcCommand updateCmd = new OdbcCommand("UPDATE Users " + 
    " SET Password = ?, LastPasswordChangedDate = ?" + 
    " WHERE Username = ? AND ApplicationName = ? AND IsLockedOut = False", conn); 

    updateCmd.Parameters.Add("@Password", OdbcType.VarChar, 255).Value = EncodePassword(newPassword); 
    updateCmd.Parameters.Add("@LastPasswordChangedDate", OdbcType.DateTime).Value = DateTime.Now; 
    updateCmd.Parameters.Add("@Username", OdbcType.VarChar, 255).Value = username; 
    updateCmd.Parameters.Add("@ApplicationName", OdbcType.VarChar, 255).Value = pApplicationName; 

    rowsAffected = updateCmd.ExecuteNonQuery(); 
} 
catch (OdbcException e) 
{ 
    if (WriteExceptionsToEventLog) 
    { 
    WriteToEventLog(e, "ResetPassword"); 

    throw new ProviderException(exceptionMessage); 
    } 
    else 
    { 
    throw e; 
    } 
} 
finally 
{ 
    if (reader != null) { reader.Close(); } 
    conn.Close(); 
} 

if (rowsAffected > 0) 
{ 
    return newPassword; 
} 
else 
{ 
    throw new MembershipPasswordException("User not found, or user is locked out. Password not Reset."); 
} 
} 

답변

1

나는 그것을 알아 낸 것 같아요. Entity에 Linq를 사용하면 EntityException을 잡을 수 있습니다. 위의 코드에서 OdbcException의 동일 함이됩니다.

이 시간을 보냈던 사람 덕분입니다.

관련 문제