更新密码字段时条件表达式中的数据类型不匹配

Data type mismatch in criteria expression while updating password field

这是我的 Select OLEDB DB 更新代码。

我在更改密码字段值时遇到条件表达式中的数据类型不匹配错误。

所有四个字段都设置为长文本数据类型。

更新查询

con = Class1.dbconn
cmd = New OleDbCommand("Update User_details set User_ID ='" & TextBox1.Text & "', User_Name='" & TextBox2.Text & "', [Password]='" & TextBox3.Text & "' where Sno='" & Label4.Text & "'", con)
cmd.ExecuteNonQuery()
MessageBox.Show("User Details Updated")

Select查询

cmd = New OleDbCommand("select * from User_details where User_ID='" & TextBox1.Text & "'", con)
Dim dr As OleDbDataReader
dr = cmd.ExecuteReader
If dr.Read Then
    Label4.Text = dr("Sno").ToString
    TextBox2.Text = dr("User_Name").ToString
    TextBox3.Text = dr("Password").ToString
    TextBox2.Text = TextBox2.Text.Replace("  ", "")
    TextBox3.Text = TextBox3.Text.Replace("  ", "")
    dr.Close()
End If

将您的数据库对象保存在本地,以便您可以控制何时关闭和处置它们。 Using...End 即使出现错误,使用块也会为您解决这个问题。此处演示的 Using 块负责连接和命令。注意连接线后的逗号。

始终使用 Parameters。它不仅使您的命令文本更易于阅读和编写(没有所有的引号、双引号和符号),而且还保护您的数据库免受 Sql 注入的破坏。当您使用 OleDb 提供程序时,参数在命令文本中出现的顺序必须与它们添加到参数集合中的顺序相匹配。与 Sql Server 不同,Access 不注意参数的名称;只有订单。

请注意,连接直到 .Execute... 之前才打开,并在之后立即关闭(使用 End Using)。连接是宝贵的资源。我在 SelectUser 子中使用了 DataTable 而不是 DataReader,因此我可以在更新用户界面之前关闭连接。在 UpdatePassword 子中,连接在显示 MessageBox 之前关闭。毕竟最终用户可能已经去吃午饭了,你的连接会随风飘扬。

至于类型不匹配,请检查@Jimi 提供的链接,然后检查您的数据库以查看 OleDbType 是否匹配。

Private Sub UpdatePassword()
    Using con As New OleDbConnection("Your connection string"),
            cmd As New OleDbCommand("Update User_details set User_ID = @ID, User_Name = @Name, [Password]= @Password Where Sno= @Sno;", con)
        With cmd.Parameters
            .Add("@ID", OleDbType.LongVarChar).Value = TextBox1.Text
            .Add("@Name", OleDbType.LongVarChar).Value = TextBox2.Text
            .Add("@Password", OleDbType.LongVarChar).Value = TextBox3.Text
            .Add("@Sno", OleDbType.LongVarChar).Value = Label4.Text
        End With
        con.Open()
        cmd.ExecuteNonQuery()
    End Using
    MessageBox.Show("User Details Updated")
End Sub

Private Sub SelectUser()
    Dim dt As New DataTable
    Using con As New OleDbConnection("Your connection string"),
        cmd As New OleDbCommand("select * from User_details where User_ID= @ID;", con)
        cmd.Parameters.Add("@ID", OleDbType.LongVarChar).Value = TextBox1.Text
        con.Open()
        dt.Load(cmd.ExecuteReader)
    End Using

    If dt.Rows.Count > 0 Then
        Dim row As DataRow = dt.Rows(0)
        Label4.Text = row("Sno").ToString
        TextBox2.Text = row("User_Name").ToString
        TextBox3.Text = row("Password").ToString
        TextBox2.Text = TextBox2.Text.Replace("  ", "")
        TextBox3.Text = TextBox3.Text.Replace("  ", "")
    End If
End Sub

最后,永远不要将密码存储为纯文本。他们应该加盐和散列。我将留给您研究如何执行此操作。