1

为什么我会收到此错误?“OledbException 未处理” “条件表达式中的数据类型不匹配。”

查询字符串数据类型的时候是没有问题的,但是查询整数数据类型的时候总是遇到这个问题。。

我正在使用 microsoft access 2007

这是我的源代码:

Public Function searchMemberId(ByVal userId As String) As DataSet
    sqlStr = "Select Member_ID From tblMemberInfo Where Member_ID = '" & _
        Val(userId) & "'"
    ds.Clear()
    da = New OleDbDataAdapter(sqlStr, con.ConnectionString)
    da.Fill(ds, "john")

    Return ds
End Function

Member_ID 的数据类型是自动编号,错误总是指向 da.Fill(ds, "john")

“ds”是一个数据集

4

2 回答 2

1

如果您查询数字类型,请不要使用引号

SELECT Member_ID 
FROM tblMemberInfo
WHERE Member_ID = 17

如果查询字符串类型,请使用引号

SELECT Member_ID 
FROM tblMemberInfo
WHERE Member_ID = 'john'

更新

在这种情况下,该Val功能将无济于事。简单地写

sqlStr = "SELECT ... WHERE Member_ID = " & userId

如果 ID 是一个字符串,它可以包含单引号,您必须在 SQL 字符串中使用双引号对其进行转义

ID = "John's record"
sqlStr = "SELECT ... WHERE Member_ID = '" & ID.Replace("'", "''") & "'"
' ==> "SELECT ... WHERE Member_ID = 'John''s record'"

这也有助于防止SQL 注入(维基百科)。然而,更专业的方法是使用参数。请参阅 MSDN 上的 Steve 的答案和DataAdapter 参数 (ADO.NET)(尤其是“OleDb 参数占位符”和“OleDb 示例”部分。

于 2012-06-18T17:16:32.647 回答
1

您应该使用参数,并且不会发生此类问题。

sqlStr = "Select Member_ID From tblMemberInfo Where Member_ID = ?" 
ds.Clear() 
da = New OleDbDataAdapter(sqlStr, con.ConnectionString) 
da.SelectCommand.Parameters.AddWithValue("@id", Convert.ToInt32(userID))
da.Fill(ds, "john") 
Return ds 
于 2012-06-18T17:22:06.803 回答