Search code examples
sqlvb.netms-accessoledb

Data type mismatch in criteria expression while updating password field


This is my Select & Update code for OLEDB DB.

I am getting a Data type mismatch in criteria expression error whilst changing the Password field value.

All four fields are set to Long Text datatype.

Update Query

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 Query

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

Solution

  • Keep your database objects local so you can control when they are closed and disposed. Using...End Using blocks take care of this for you even if there is an error. The Using blocks demonstrated here take care of both the connection and the command. Note the comma after the connection line.

    Always use Parameters. Not only does it make your command text easier to read and write (without all the quotes, double quotes and ampersands) but it protects your database from the destruction of Sql injection. When you are using the OleDb provider it is essential that order that the parameters appear in the command text match the order they are added to the parameters collection. Unlike Sql Server, Access pays no attention to the names of the parameters; only the order.

    Notice that the connection is not opened until right before the .Execute... and is closed (with the End Using) directly after. Connections are precious resources. I used a DataTable instead of a DataReader in the SelectUser sub so I could close the connection before updated the user interface. In the UpdatePassword sub the connection is closed before showing the MessageBox. After all the end user could have gone to lunch and there would be your connection flapping in the breeze.

    As far as the type mis-match check the links provided by @Jimi and then check your database to see if the OleDbType matches.

    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
    

    Finally, you should NEVER store passwords as plain text. They should be salted and hashed. I will leave it to you to research how to do this.