Запрос MS-Access неправильно интерпретирует DBNull.Value с помощью OLEDB.NET - PullRequest
0 голосов
/ 02 октября 2011

Я подключаюсь к базе данных MS-Access 2007, используя VB 2010 и OLEDB. Проведение следующего теста предполагает, что MS-Access неправильно интерпретирует DBNull.Value при отправке в качестве параметра из OLEDB:

(Таблица «Больница» содержит 1 строку со столбцом «LatLong», установленным в ноль)

Dim cnt = Common.GetScalar(axsCon, "SELECT Count(*) FROM Hospitals WHERE LatLong = @LL ", _
                New String() {"LL"},
                New Object() {DBNull.Value})

Этот запрос возвращает cnt = 0

Тем не менее: cnt = Common.GetScalar (axsCon, "SELECT Count (*) ИЗ Больниц, ГДЕ LatLong IS NULL")

возвращает cnt = 1

Любые идеи приветствуются.

p.s .: Common.GetScalar выглядит так:

Public Shared Function GetScalar( _
    ByRef OleCon As OleDbConnection, _
    ByRef SQL As String, _
    Optional ByRef Params() As String = Nothing, _
    Optional ByRef Vals() As Object = Nothing, _
    Optional IsQuery As Boolean = False) As Object
    Try
        Dim oleCmd As OleDbCommand = OleCon.CreateCommand
        oleCmd.CommandType = IIf(IsQuery, CommandType.StoredProcedure, CommandType.Text)
        oleCmd.CommandText = SQL
        If Not Params Is Nothing Then
            Dim pInx As Int16
            For pInx = 0 To Params.Count - 1
                oleCmd.Parameters.AddWithValue(Params(pInx), Vals(pInx))
            Next
        End If
        Return oleCmd.ExecuteScalar()
    Catch ex As Exception
        Throw New Exception(ex.Message)
    End Try
End Function

ТИА

Ответы [ 2 ]

1 голос
/ 04 октября 2011

Изменение

"SELECT Count(*) FROM Hospitals WHERE LatLong = @LL"

до

"SELECT Count (*)
ОТ Больниц
ГДЕ 1 =
ДЕЛО
КОГДА @LL равен нулю, а LatLong равен нулю, то 1
КОГДА LatLong = @LL THEN 1
END "

Затем будет проверено на нулевое или совпадающее значение. Нули могут быть очень и очень хитрыми.

0 голосов
/ 03 октября 2011

Ваш GetScalar выполнит запрос:

SELECT Count(*) FROM Hospitals WHERE LatLong = NULL

но вы хотите

SELECT Count(*) FROM Hospitals WHERE LatLong IS NULL

Вам нужно отключить = для IS, если вы сравниваете с нулем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...