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
если есть больше строк и столбцов, но дело в том, что он возвращает только первую строку и столбец.