试图跟踪条件表达式中的数据类型不匹配

Posted

技术标签:

【中文标题】试图跟踪条件表达式中的数据类型不匹配【英文标题】:Trying to trace Data type mismatch in criteria expression 【发布时间】:2021-10-29 17:07:39 【问题描述】:

我无法追踪,错误是:

条件表达式中的数据类型不匹配。

Private Sub UpdateLV(ByVal  id As String)

    Dim SQL As String = "UPDATE tbl_sharePay SET Old_code= '" & ComboBox6.Text & "' ,Chapa= '" & TextBox2.Text & "' , Fname= '" & TextBox3.Text & "', Lname= '" & TextBox4.Text & "', Spgroup= '" & TextBox6.Text & "', Sharecap= '" & TextBox7.Text & "', PrevSP= '" & TextBox8.Text & "', CurSP= '" & TextBox9.Text & "', Rec= '" & DateTimePicker1.Text & "' , SpYear= '" & TextBox11.Text & "', Spstatus= '" & ComboBox1.Text & "' WHERE Old_code=" & id & ""
    cmd = New OleDbCommand(sql, con)

    If con.State <> ConnectionState.Open Then
        con.Open()
    End If

    adapter = New OleDbDataAdapter(cmd)
    adapter.UpdateCommand = con.CreateCommand()
    adapter.UpdateCommand.CommandText = sql

    If (adapter.UpdateCommand.ExecuteNonQuery() > 0) Then
        cleartextboxes()
        MsgBox("Successfully Updated")
    End If

    con.Close()
    Retrieve()

    If con.State <> ConnectionState.Closed Then
        con.Close()
    End If

    End Try
End Sub

【问题讨论】:

这个错误很容易解释。在您的更新语句中的某处,您尝试使用与 tbl_sharePay 的字段类型不匹配的类型的变量。使用 Sql 参数和其他好处,这个问题几乎消失了。 请阅读您添加到问题中的标签的描述并删除不必要的标签 我也看不到匹配 end try 的尝试。 请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。 【参考方案1】:

问题——至少是一个问题——应该是相当明显的。错误消息告诉您数据类型存在问题,因此您应该检查该 SQL 代码中每一列和每个值的数据类型。你显然没有这样做。

您在SET 子句和WHERE 子句中都指定了Old_code 列,但是您在一个位置用单引号括起该值,表明该值是一个字符串,而不是在另一个位置,表示该值可能是一个数字。显然他们不可能都是正确的。您需要确定该列是什么数据类型,并在 SQL 代码的两个位置使用该类型的数据。我们无法判断,但您很有可能也在对其他一个或多个列进行类似的操作。

正如 cmets 中所建议的,如果您编写了正确的 ADO.NET 代码并使用了参数而不是字符串连接,那么这样的问题就会消失。我建议您阅读this 并相应地修改您的代码。

【讨论】:

【参考方案2】:

在使用它的方法中声明您的连接。除了关闭之外,还需要处理连接。 Using...End Using 块用于完成此操作。您不需要检查连接状态,因为它是在本地创建的。

始终使用参数来避免 Sql 注入。 OleDb 与参数名称不匹配。它是定位的。参数出现在 CommandText 中的顺序必须与参数添加到参数集合的顺序相匹配。您需要仔细检查数据库中的 OleDbTypes 并相应地更正代码。如果分配给参数的任何值需要是数字,请务必进行转换,以便将正确的类型发送到数据库。

在 Execute.... 之前不要打开连接。

您不需要 DataAdapter。只需执行您的命令。当您使用 DataAdapter 时,它将为您打开和关闭连接。构造函数(新建)使用 Select 命令而不是 Update 命令。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim Id As Integer = 7 'Whatever value
    Dim RecordsUpdated As Integer
    Try
        RecordsUpdated = UpdateLV(Id)
        If RecordsUpdated = 1 Then
            cleartextboxes()
            MessageBox.Show("Successfully Updated")
            Retrieve()
        Else
            MessageBox.Show("Update Failed")
        End If
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub

Private Function UpdateLV(ByVal id As Integer) As Integer
    Dim RecordsAffected As Integer
    Dim SQL As String = "UPDATE tbl_sharePay 
                        SET Old_code= @OldCode, 
                        Chapa= @Chapa, 
                        Fname= @Fname, 
                        Lname= @Lname, 
                        Spgroup= @Sp,   
                        Sharecap= @Share, 
                        PrevSP= @PrevSP, 
                        CurSP= @CursP, 
                        Rec= @Rec, 
                        SpYear= @Year, 
                        Spstatus= @Status 
                        WHERE Old_code= @ID;"
    Using con As New OleDbConnection("Your connection string."),
        cmd = New OleDbCommand(SQL, con)
        With cmd.Parameters
            .Add("@OldCode", OleDbType.Integer).Value = CInt(ComboBox6.Text)
            .Add("@Chapa", OleDbType.VarChar).Value = TextBox2.Text
            .Add("@Fname", OleDbType.VarChar).Value = TextBox3.Text
            .Add("@Lname", OleDbType.VarChar).Value = TextBox4.Text
            .Add("@Sp", OleDbType.VarChar).Value = TextBox6.Text
            .Add("@Share", OleDbType.VarChar).Value = TextBox7.Text
            .Add("@PrevSP", OleDbType.VarChar).Value = TextBox8.Text
            .Add("@CursP", OleDbType.VarChar).Value = TextBox9.Text
            .Add("@Rec", OleDbType.Date).Value = DateTimePicker1.Value
            .Add("@Year", OleDbType.VarChar).Value = TextBox11.Text
            .Add("@Status", OleDbType.VarChar).Value = ComboBox1.Text
            .Add("@ID", OleDbType.Integer).Value = id
        End With
        con.Open()
        RecordsAffected = cmd.ExecuteNonQuery()
    End Using
    Return RecordsAffected
End Function

【讨论】:

以上是关于试图跟踪条件表达式中的数据类型不匹配的主要内容,如果未能解决你的问题,请参考以下文章

错误“条件表达式中的数据类型不匹配”

条件表达式中的数据类型不匹配

MS Access - 条件表达式中的数据类型不匹配

条件表达式中的数据类型不匹配

条件表达式中的 C# 数据类型不匹配

条件表达式访问中的查询数据类型不匹配