【问题标题】:Password expired密码已过期
【发布时间】:2013-02-25 23:28:41
【问题描述】:

我在 vb.net 和 Oracle 数据库中有一个项目。当用户密码在 oracle 中过期时会导致 oracle exeption。我处理了那个异常(打开一个 ChangePassword 表单并更改了密码),但是我丢失了当错误出现时我准备执行的过程:
示例:

  Try
            conn = New OracleConnection
            conn.ConnectionString = gApp.ConnectString
            conn.Open()

          'Let's say that error appears here, I want to retun here after password has been changed

            cmd.Connection = conn
            cmd.CommandText = "Delete_Transaction"
            cmd.CommandType = CommandType.StoredProcedure
            OracleCommandBuilder.DeriveParameters(cmd)
            cmd.Parameters("in_transaction_id").Value = TransactionId
            cmd.ExecuteNonQuery()
            conn.Close()


        Catch ex As OracleException
           'PseudoCode:  if error is PasswordExpired->open the ChengePassForm...blah,blah
           'is handled by a Error class that i have
        Finally
            If Not conn Is Nothing Then
                conn.Dispose()
            End If
        End Try

主要问题是代码中到处都可能出现问题,我的意思是不同的程序,不同的形式等。
所以我需要一个通用的解决方案。实际上我什至无法想象一个正确的逻辑来解决这个问题?谁能给我指个方向?

【问题讨论】:

    标签: .net vb.net oracle


    【解决方案1】:

    您可以创建一个接受Action(Of OracleCommand) 的函数。

    Try Catch 块中调用代理,如果密码更改,只需再次调用操作以使用正确的密码重新运行代码。

    您可以使用 lambda 表达式调用此函数。
    请注意,lambda 表达式中的所有内容都可能运行不止一次。

    【讨论】:

    • 我对delegate和lamdas表达式不太熟悉。你能说得更具体点吗?
    【解决方案2】:

    使用嵌套的 try catch 语句:

    Try
        Try
            conn = New OracleConnection
            conn.ConnectionString = gApp.ConnectString
            conn.Open()
    
            'Let's say that error appears here, I want to retun here after password has been changed
        Catch ex1 As OracleException
           'PseudoCode:  if error is PasswordExpired->open the ChengePassForm...blah,blah
           'is handled by a Error class that i have
        Catch ex2 As Exception
            ' throw ex2 to be handled by the parent try catch
        End Try
    
        cmd.Connection = conn
        cmd.CommandText = "Delete_Transaction"
        cmd.CommandType = CommandType.StoredProcedure
        OracleCommandBuilder.DeriveParameters(cmd)
        cmd.Parameters("in_transaction_id").Value = TransactionId
        cmd.ExecuteNonQuery()
        conn.Close()
    
    
    Catch ex As Exception
       'PseudoCode:  if error is PasswordExpired->open the ChengePassForm...blah,blah
       'is handled by a Error class that i have
    Finally
        If Not conn Is Nothing Then
            conn.Dispose()
        End If
    End Try
    

    【讨论】:

    • 问题是你不知道错误会在何时何地出现。
    • 您可以根据需要添加任意数量的“try catch 语句”。密码错误只会在登录时发生,并且由于您正在处理特定的错误,因此您应该知道错误会发生在哪里。
    猜你喜欢
    • 2017-03-09
    • 2013-07-07
    • 2012-03-17
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多