在代码隐藏中,我有以下内容:
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”
我认为如果前面的代码中有一些错误,它应该只执行该代码 - 但是如果它执行,则前一代码中不会出现错误。就像它正在执行catch代码而不管我要去的是什么。
奇怪的是,它只会让重定向变得混乱!如果我将重定向替换为goback2并赋值给textbox.text然后它可以工作(通过忽略该代码) - 但重定向它似乎执行,无论它是否应该采取捕获
答案 0 :(得分:4)
Response.Redirect(string)
在调用Response.End()
时抛出ThreadAbortException
。
使用带字符串和布尔值的重载:
Response.Redirect("goback.html", false);
来自MSDN:第二个参数endResponse
,“表示当前页面的执行是否应该终止。”
答案 1 :(得分:3)
Response.Redirect
会抛出ThreadAbortException
来终止当前请求。
您的Catch
阻止了该异常。
答案 2 :(得分:2)
由于Response.Redirect,可能是因为ThreadAbortedException。 - MSDN support link
答案 3 :(得分:1)
您尚未打开连接。您无法在Try / Catch中重定向。你应该设置一个布尔变量success
到false
并在Try / Catch / Finally之后检查它,如果设置为false
则重定向。
看看这个SO-Question:Is there something that prevents Response.Redirect to work inside try-catch block?
这会更好:
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