VB.NET中条件表达式错误中的数据类型不匹配

VB.NET中条件表达式错误中的数据类型不匹配,vb.net,ms-access-2013,Vb.net,Ms Access 2013,您好,我在VB中遇到上述错误,当尝试以下代码时,我在表单上有3个文本框,在用户输入股票代码后,我希望表单在相关文本框中输入匹配的产品组和产品说明。我使用的代码如下 Private Sub txt_productcode_Leave(sender As Object, e As EventArgs) Handles txt_productcode.Leave Dim dt As New DataTable Dim connstring As String = "Provider=M

您好,我在VB中遇到上述错误,当尝试以下代码时,我在表单上有3个文本框,在用户输入股票代码后,我希望表单在相关文本框中输入匹配的产品组和产品说明。我使用的代码如下

Private Sub txt_productcode_Leave(sender As Object, e As EventArgs) Handles txt_productcode.Leave
    Dim dt As New DataTable
    Dim connstring As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:database
    Dim SqlString As String = "select [product group],[product description] from [stock] where [stock code] = " & txt_productcode.Text & ""
    Using conn As New OleDbConnection(connstring)
        Using command As New OleDbCommand(SqlString, conn)
            Using adapter As New OleDbDataAdapter(command)
                conn.Open()
                adapter.Fill(dt)
                conn.Close()
            End Using
            Dim MyDataRow As DataRow = dt.Rows(0)
            Dim x As Integer
            x = dt.Rows.Count
            For y = 0 To x - 1
                If y < x Then
                    MyDataRow = dt.Rows(y)
                    txt_productgroup.Text = MyDataRow("product group")
                    txt_productdescription = MyDataRow("product description")

                End If
            Next
        End Using
    End Using
End Sub

有人能解释一下为什么这不起作用吗?谢谢

嗯,您的SQL语句可能包含错误。可能在WHERE条件中缺少引号字符:

"… WHERE [stock code] = '" + ... + "'"
'                       ^           ^

顺便说一句,由于使用简单的字符串连接而不是使用参数化查询来生成SQL命令,您的代码容易受到SQL注入攻击。

首先要做的是在生成命令文本并使用参数时删除字符串连接,然后为描述而不是其文本属性设置文本框。删除了一些无用的代码

Private Sub txt_productcode_Leave(sender As Object, e As EventArgs) Handles txt_productcode.Leave
    Dim dt As New DataTable
    Dim connstring As String = "...."
    Dim SqlString As String = "select [product group],[product description] " & _
       "from [stock] where [stock code] = @stock"
    Using conn As New OleDbConnection(connstring)
        Using command As New OleDbCommand(SqlString, conn)
            Using adapter As New OleDbDataAdapter(command)
                conn.Open()
                command.Parameters.AddWithValue("@stock", txt_productcode.Text)
                adapter.Fill(dt)
            End Using
            For y = 0 To dt.Rows.Count - 1
                Dim MyDataRow = dt.Rows(y)
                txt_productgroup.Text = MyDataRow("product group").ToString()
                txt_productdescription.Text = MyDataRow("product description").ToString()

            Next
        End Using
    End Using
End Sub

这里有一个链接指向其他318个副本:真棒,我现在将阅读所有318篇文章,希望对于像我这样的初学者来说,其中一篇可能有一些类似的代码我可以理解。谢谢它们是重复的,这意味着你不必全部阅读。你的情况并非独一无二。数据类型不匹配错误是由相同的错误引起的。引用:“Find方法中的条件表达式试图将字段与数据类型与字段数据类型不匹配的值进行比较。”@Bjørn RogerKringsjå。像这样的网站出现后,学习变得高度本地化。有些人只对解决问题所涉及的1、2、3个步骤感兴趣,而不是一般地理解问题——并在本地应用它。这导致同一个人提出“完全不同”的问题,即如何修复SQL INSERT语句中的数据不匹配错误。顺便说一句,这是一项艰苦的工作!你必须更改SO标题,使其足够独特,这样它才会发布,你必须忽略它要求你首先检查的320个类似问题的“噪音”。谢谢你的回复。很明显,我在应用程序构建或sql方面没有经验,但我正试图把一些东西拼凑在一起,希望能奏效。如果你不介意的话,你能解释一下为什么当设置股票代码作为一个参数时,它起作用了,而我的为什么不起作用呢?很抱歉耽搁了。使用参数时,不仅要传递该参数的值,还要传递类型。在您的例子中,AddWithValue决定您要传递一个字符串。现在,一个字符串值,当按字面意思传递时,就像你在连接中尝试做的那样,需要用你错过的单引号括起来。相反,当引擎看到字符串类型的参数时,它知道如何处理参数值。在处理命令文本时始终使用此方法,并让引擎处理值(DateTime和十进制分隔符是concats的另一个大问题)现在,为了回答此问题,我使用AddWithValue方法定义参数、其类型和大小。但要注意的是,AddWithValue的优势伴随着隐藏的成本。在开始讨论AddWithValues之前,很抱歉回复太晚,但我只想再次感谢您的解释。感谢您的回复,当股票代码都是数字时,SQL似乎确实存在问题,当股票代码都是数字和文本时,SQL似乎起作用。奇怪,一点也不奇怪。这显然是某种类型的隐式强制。如果您有一个数值,但没有以字符串文字的形式显式指定它,则会将其推断为数值数据类型(股票代码可能不是)。只要该值包含字母数字字符,就别无选择,只能推断它是字符串类型。
Private Sub txt_productcode_Leave(sender As Object, e As EventArgs) Handles txt_productcode.Leave
    Dim dt As New DataTable
    Dim connstring As String = "...."
    Dim SqlString As String = "select [product group],[product description] " & _
       "from [stock] where [stock code] = @stock"
    Using conn As New OleDbConnection(connstring)
        Using command As New OleDbCommand(SqlString, conn)
            Using adapter As New OleDbDataAdapter(command)
                conn.Open()
                command.Parameters.AddWithValue("@stock", txt_productcode.Text)
                adapter.Fill(dt)
            End Using
            For y = 0 To dt.Rows.Count - 1
                Dim MyDataRow = dt.Rows(y)
                txt_productgroup.Text = MyDataRow("product group").ToString()
                txt_productdescription.Text = MyDataRow("product description").ToString()

            Next
        End Using
    End Using
End Sub