我应该怎么做“标准表达式中的数据类型不匹配”

时间:2012-06-18 17:10:10

标签: vb.net ms-access-2007 oledbexception

为什么我收到此错误? " 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"是数据集

3 个答案:

答案 0 :(得分: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 injections(维基百科)。然而,更专业的方法是使用参数。请参阅Steve的回答和MSDN上的DataAdapter Parameters (ADO.NET)(特别是“OleDb参数占位符”和“OleDb示例”部分。

答案 1 :(得分: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 

答案 2 :(得分:-1)

如奥利弗所说,如果您查询数字类型,请不要使用引号

cmd = "Update [myTABLE] set [CNAMES]='" & CNAMESTextbox.Text & "', [BNAMES]='" & BNAMESTextbox.Text & "'  where [ID]=" & IDTextbox.Text & ""