2012-06-18 51 views
2

爲什麼會出現這個錯誤呢? 「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, 「約翰」)

「DS」 是一個數據集

回答

1

如果查詢數字類型,不如果查詢字符串類型使用引號

SELECT Member_ID 
FROM tblMemberInfo 
WHERE Member_ID = 17 

,不要使用引號

SELECT Member_ID 
FROM tblMemberInfo 
WHERE Member_ID = 'john' 

UPDATE

的在這種情況下,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(維基百科)用雙引號逃逸的字符串。然而,更專業的方法是使用參數。見史蒂夫的MSDN上的答案和DataAdapter Parameters (ADO.NET)(特別是「OleDb的參數佔位符」和「OleDb的示例」部分。

+0

感謝先生,它的工作原理,我忘了那.. – user188228

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 
相關問題