что мне делать при несоответствии типа данных в выражении критериев

Почему я получаю эту ошибку? «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 - autonumber, ошибка всегда указывала на da.Fill(ds, "john")

"ds" - это набор данных


person user188228    schedule 18.06.2012    source источник


Ответы (2)


Если вы запрашиваете числовой тип, не используйте кавычки

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

Если бы идентификатор был строкой, он мог бы содержать одинарные кавычки, которые вы должны экранировать двойными кавычками в строке SQL.

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

Это также помогает предотвратить инъекции SQL (Википедия). Однако более профессиональный подход заключается в использовании параметров. См. ответ Стива и Параметры DataAdapter (ADO.NET) в MSDN (особенно разделы «Заполнители параметров OleDb» и «Пример OleDb».

person Olivier Jacot-Descombes    schedule 18.06.2012

Вы должны использовать параметры, и такого рода проблемы не возникают.

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 
person Steve    schedule 18.06.2012