vb.net上的FormatException是未处理的错误

时间:2018-11-03 10:33:17

标签: mysql vb.net

我是Stack Overflow的新手,但是无论如何我在代码方面都遇到了问题。当我尝试运行该程序并单击Login函数时,在此语句上出现错误... Adapter.Fill(Table)它说:未处理FormatException。 mscorlib.dll中发生了'System.FormatException'类型的未处理异常。其他信息:输入字符串的格式不正确。

Imports MySql.Data.MySqlClient
Public Class Login_page
    Private Sub Login_page_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.CenterToScreen()
    End Sub

    Private Sub PictureBox3_Click(sender As Object, e As EventArgs) Handles PictureBox3.Click
        Close()
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim MysqlConnection As New MySqlConnection("host=127.0.0.1; user=root; database = storage_db")
        Dim Command As New MySqlCommand("SELECT * FROM `login_access` where username = @username and password = @password", MysqlConnection)

        Command.Parameters.AddWithValue("@username", SqlDbType.VarChar).Value = TextBoxUsername.Text
        Command.Parameters.AddWithValue("@password", SqlDbType.VarChar).Value = TextBoxPassword.Text

        Dim Adapter As New MySqlDataAdapter(Command)
        Dim Table As New DataTable()

        Adapter.Fill(Table)

        If Table.Rows.Count() <= 0 Then
            MessageBox.Show("Invalid")
        Else
            MessageBox.Show("Login Successfully")
        End If

    End Sub
End Class

1 个答案:

答案 0 :(得分:2)

这些行的错误有多种原因:

Command.Parameters.AddWithValue("@username", SqlDbType.VarChar).Value = TextBoxUsername.Text
Command.Parameters.AddWithValue("@password", SqlDbType.VarChar).Value = TextBoxPassword.Text

首先,您将MySqlClient用于MySQL,而不是SqlClient用于SQL Server。这意味着您需要使用MySqlDbType而不是SqlDbType

第二和第三,您需要确定要使用Add还是AddWithValue,因为实际上是混合和匹配。如果您使用AddWithValue,则不会指定数据类型,因为它是根据值推断的:

Command.Parameters.AddWithValue("@username", TextBoxUsername.Text)
Command.Parameters.AddWithValue("@password", TextBoxPassword.Text)

但是通常不建议这样做,因为推断的类型通常不是您想要的类型。这意味着您应该使用Add。在这种情况下,您还应该指定可变长度数据类型的大小:

Command.Parameters.Add("@username", MySqlDbType.VarChar, 50).Value = TextBoxUsername.Text
Command.Parameters.Add("@password", MySqlDbType.VarChar, 50).Value = TextBoxPassword.Text

编辑:

为了记录,您的原始代码中发生的基本上是这样的:

Dim p = Command.Parameters.AddWithValue("@username", SqlDbType.VarChar)

p.Value = TextBoxUsername.Text

因此,正在添加一个值为SqlDbType.VarChar的参数,该值将被解释为Integer并由此推断出参数数据类型。然后使用无法转换为Value的{​​{1}}设置了该参数的String,因此抛出了Integer