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

问题描述 投票:-1回答:1

这是我的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")

选择查询

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
sql vb.net ms-access oledb
1个回答
0
投票

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

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

[请注意,直到.Execute...之前,连接才被打开,而End Using之前的连接被关闭。连接是宝贵的资源。我在DataTable子目录中使用了DataReader而不是SelectUser,因此可以在更新用户界面之前关闭连接。在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

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

© www.soinside.com 2019 - 2024. All rights reserved.