2014-03-24 121 views
0

我在ASP.NET登录表单上的标题中收到错误消息有人知道我该如何解决它?帮助深表感谢从字符串“”转换为“布尔型”类型无效

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click 
    Dim conn As New MySqlConnection 

    conn.ConnectionString = ("server=localhost;port=3307;user=user;password=password;database=DB;") 

    Try 

    Dim SQL As String = "select * from users3 where uname = '" & txtUName.Text & "' AND password = '" & txtPwd.Text & "'" 

    conn.Open() 

    Dim cmd As New MySqlCommand(SQL, conn) 
    Dim reader As MySqlDataReader = cmd.ExecuteReader 

     reader.Read() 
     Dim isValidLogin As Boolean 
     Boolean.TryParse(reader.GetValue(1), isValidLogin) 

     If isValidLogin Then 
      Session("UserName") = txtUName.Text 
     Response.Redirect("REGISTERPROP.aspx") 
    Else 
     Response.Write("Invalid Login") 
    End If 

    Catch ex As Exception 
    Response.Write("An Error Occurred: " & ex.Message.ToString()) 
    End Try 
End Sub 
+0

可能重复[从字符串到boolean类型的转换是无效的(http://stackoverflow.com/questions/7874049/conversion-from-string-to-type -boolean-is-not-valid) –

+0

该问题已解决,我认为我没有收到错误消息,但现在正在获取此“在调用Read()之前访问字段的无效尝试”在asp上很虚弱。网和帮助非常感谢! – user3457014

+0

请将此问题设置为回答,并在发布当前代码时提出新问题。 – NotMe

回答

1

变化:

Dim isValidLogin = reader.GetValue(1) 

到:

Dim isValidLogin As Boolean 
Boolean.TryParse(reader.GetValue(1), isValidLogin) 
+0

谢谢,我现在收到此错误消息“在调用Read()之前无效尝试访问字段”您有任何想法吗?我感谢帮助! – user3457014

+1

你仍然会打电话给reader.Read(),对不对?这仍然是isValidLogin声明之前? –

+0

的确是这样,这看起来: 昏暗读者作为了MySqlDataReader = cmd.ExecuteReader reader.Read() 昏暗isValidLogin由于布尔 Boolean.TryParse(读取器。如果isValidLogin然后 会话(“UserName”)= txtUName.Text – user3457014

1

好,消息是非常不言自明。你试图将一个空的(无)字符串转换为布尔值。 Boolean唯一有效的字符串值是(不区分大小写的)truefalse。你还有其他问题。如果用户/密码发现

  • 查询返回0行(空集),如果没有找到用户名/密码,和(大概)1列。但是,您不检查Read()方法的返回值:如果读取了一行,它将返回true,并返回false otherwise。您只能查询成功匹配时返回的行:您应该在尝试从其中检索数据之前检查该行。

  • 此外,您的查询还有一个SQL Injection漏洞。考虑使用参数化查询或存储过程。你觉得如果有人类型(或简称公告)这回你的页面的密码字段可能会发生:

    ; drop table users3 ; 
    
  • 看来你存储在数据库中的明文密码。结合您的SQL注入漏洞,您可能会对系统和用户造成危害。考虑使用类似SHA-256的secure hashing algorithm对密码进行腌制并对腌制的密码进行散列。

查询更改为

`select 'true' from user3 where ...` 

而且使用DbReader.ExecuteScalar(),如果结果集为空时返回结果的第一行设置或null的第一列执行它。然后你的逻辑变得更加简单,像

Dim isValidLogin = cmd.ExecuteScalar() 
If isValidLogin IsNot Nothing And isValidLogin Then 
    Session("UserName") = txtUName.Text 
    Response.Redirect("REGISTERPROP.aspx") 
Else 
    Response.Write("Invalid Login") 
End If 
+0

我知道我的代码很容易SQL注入,我会在这之后...我的主要目标是获得这个登录表单工作,我必须手这是明天在大学,如果我不能得到它的工作,我会失败,我强调,因为我在asp.net弱,我根本无法获得形式的工作..看着我的完整代码可以让你知道它应该是什么样子才能工作?你不会相信我会有多棒! – user3457014

+0

我不是一个VB.Net的家伙,所以我会成为你的错误资源:D –

+0

感谢您的帮助,无论如何,它只是令我沮丧,现在我不是一个编码员,所以我觉得这非常困难,尤其是当它影响我年级 :( – user3457014

相关问题