【问题标题】:Data type mismatch in criteria expression while updating password field更新密码字段时条件表达式中的数据类型不匹配
【发布时间】:2020-04-08 06:16:30
【问题描述】:

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

【问题讨论】:

  • 什么是Longtext?你的意思是Memo?使用参数构建查询 (OleDbCommand.Parameters.Add())。另请参阅INFO: OleDbType Enumeration vs. Microsoft Access Data Types
  • 向我们展示您的表创建语句。如果使用 Sql Server Management Studio,右键单击该表并选择 Script table as create 到 New Window。此外,正如@Jimi 所说,您应该考虑使用参数而不是内联 sql。此代码对 sql 注入攻击开放。如果这只是为了学习,好吧。搞定后,去学习正确的方法。你永远不应该在生产应用程序中这样做。

标签: sql vb.net ms-access oledb


【解决方案1】:

将您的数据库对象保存在本地,以便您可以控制它们何时关闭和处置。 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

最后,您永远不应该将密码存储为纯文本。它们应该加盐和散列。我会把它留给你研究如何做到这一点。

【讨论】:

    猜你喜欢
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多