asp.net vb codebehind попробуйте ... поймать проблему - PullRequest
2 голосов
/ 28 июня 2011

В коде у меня есть следующее:

Protected Sub btnSubmit_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnSubmit.Click
    Dim sql As String
    Dim conn As OleDbConnection
    Dim cmd As OleDbDataAdapter
    Dim ds As DataSet
    Dim tbl As DataTable

    conn = New OleDbConnection("Provider=SQLOLEDB;Data Source=(local);Initial Catalog='library';Integrated Security=SSPI;")
    Try
        sql = "SELECT f1, f2, f3 FROM mydb WHERE ltrim(rtrim(UPPER(username))) = 'MYNAME'"

        cmd = New OleDbDataAdapter(sql, conn)
        ds = New DataSet
        cmd.Fill(ds)
        tbl = New DataTable
        tbl = ds.Tables(0)

        If tbl.Rows.Count = 0 Then
            Response.Redirect("goback.html")
        End If

        Response.Redirect("dummy.html")

    Catch ex As Exception
        Response.Redirect("goback2.html")
    End Try

End Sub

Подпрограмма работает до определенного момента.Я могу проверить значение tbl.Rows.Count = 1, поэтому он должен перенаправить на «dummy.html», КОТОРЫЙ ЭТО ДЕЛАЕТ ПРАВИЛЬНО, пока я закомментирую строку, которая перенаправляет на «goback2.html».

Если я раскомментирую строку для перенаправления на goback2, она переходит к «goback2.html»

Я думал, что этот код следует выполнять только в том случае, если в предыдущем коде была какая-то ошибка - но не может бытьошибка в предыдущем коде, если он выполняется.Как будто он выполняет код перехвата независимо от того, что я собираюсь.

Как ни странно, он ТОЛЬКО портит перенаправление!Если я заменим перенаправление на goback2 на присвоение textbox.text, то оно сработает (игнорируя этот код), но перенаправление, по-видимому, будет выполнено независимо от того, должен ли он выполнить перехват

Ответы [ 4 ]

4 голосов
/ 28 июня 2011

Response.Redirect(string) выдает ThreadAbortException при вызове Response.End().

Используйте вместо этого перегрузку, которая принимает строку и логическое значение:

Response.Redirect("goback.html", false);

From MSDN : второй параметр, endResponse, "Указывает, следует ли прекратить выполнение текущей страницы."

3 голосов
/ 28 июня 2011

Response.Redirect выдает ThreadAbortException для завершения текущего запроса.

Ваш Catch блок перехватывает это исключение.

2 голосов
/ 28 июня 2011

Это может быть из-за исключения ThreadAbortedException из-за Response.Redirect.- Ссылка поддержки MSDN

1 голос
/ 28 июня 2011

Вы не открыли соединение. Вы не можете перенаправить в Try / Catch. Вы должны установить логическую переменную success в false и проверить ее после Try / Catch / finally и перенаправить, если она установлена ​​в false.

Посмотрите на этот SO-вопрос: Есть ли что-то, что мешает Response.Redirect работать внутри блока try-catch?

Это было бы лучше:

    Dim success As Boolean = True
    Dim ds As New DataSet
    Using conn As New OleDb.OleDbConnection("Provider=SQLOLEDB;Data Source=(local);Initial Catalog='library';Integrated Security=SSPI;")
        Try
            Dim Sql = "SELECT f1, f2, f3 FROM mydb WHERE ltrim(rtrim(UPPER(username))) = 'MYNAME'"
            Dim cmd = New OleDb.OleDbDataAdapter(Sql, conn)
            conn.Open()
            cmd.Fill(ds)
        Catch ex As Exception
            success = False
        End Try
    End Using
    If Not success Then
        Response.Redirect("goback2.html")
    ElseIf ds.Tables.Count <> 0 AndAlso ds.Tables(0).Rows.Count = 0 Then
        Response.Redirect("goback.html")
    Else
        Response.Redirect("dummy.html")
    End If
...