SQL-запрос возвращает неверный логический результат

Добрый день, ребята, я разрабатываю приложение для Windows Form с использованием VB.Net. 1 часть моего приложения будет накапливать данные из CSV-файла в локальной базе данных. Я написал функцию, в которой я могу проверить, существует ли конкретная запись в локальной базе данных, прежде чем приступить к дальнейшей обработке. Вот функция:

Private Function CheckTableGotEntries(ByVal tableName As String, ByVal year As String, ByVal week As String) As Boolean
        Dim stringInsert As String
        Dim result As Boolean = False
        Dim myReader As SqlCeDataReader
        stringInsert = "SELECT CASE WHEN EXISTS (" & _
                        "SELECT *" & _
                        "FROM " & tableName & _
                        " WHERE year_column = " & "'" & year & "'" & " AND week_column = " & "'" & week & "'" & _
                        ")" & _
                        "THEN CAST(1 AS BIT)" & _
                        "ELSE CAST(0 AS BIT) END"
        SQLCon.Open()
        SQLCmd = New SqlCeCommand(stringInsert, SQLCon)
        myReader = SQLCmd.ExecuteReader()
        result = myReader.Read()    'SUPPOSE TO GET FALSE HERE
        SQLCon.Close()
        Return result
    End Function

Во время работы с отладчиком я обнаружил, что эта функция возвращает "ИСТИНА" в тех местах, где предполагается возвращать "ЛОЖЬ". В самом начальном запуске, когда таблица базы данных все еще пуста и обрабатывается первая строка csv, моя функция говорит, что запись уже существует и возвращает true.

Я подозреваю, что что-то не так с моим запросом. Кто-нибудь может что-то подсказать?

1 ответ

Решение

myReader.Read() не возвращает истину или ложь из запроса SQL. Он возвращает истину, если он переходит к следующей записи, или ложь, если нет записей.

Мы обычно звоним .Read() один раз, чтобы перейти к первой записи (если она есть) и снова и снова, пока она возвращает true, чтобы мы прочитали все записи в наборе результатов.

На самом деле читать результат из SqlDataReader ты бы позвонил .Read() один раз, чтобы перейти к первой (единственной) записи, а затем вызвать

result = myReader.GetBoolean(0) 

вернуть значение первого столбца, возвращенного как boolean,

Или, так как запрос возвращает только одно значение (одна строка, один столбец), вы можете пропустить программу чтения и сделать

result =  DirectCast(SQLCmd.ExecuteScalar(), Boolean)

Ты можешь использовать ExecuteScalar если есть больше строк и столбцов, но дело в том, что он возвращает только первую строку и столбец.

Другие вопросы по тегам