1

なぜこのエラーが発生するのですか?「OledbExceptionが処理されませんでした」「基準式のデータ型が一致しません。」

文字列データ型をクエリする場合は問題ありませんが、整数データ型をクエリする場合は常にこの問題が発生します。

マイクロソフトアクセス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 に答える