SQL 查询 returns 错误的布尔结果

SQL Query returns wrong boolean result

大家好, 我正在使用 VB.Net 开发一个 windows 表单应用程序。我的应用程序的一部分会将 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

虽然 运行 调试器,我发现这个函数在它应该 return "FALSE" 的地方 returning 一个 "TRUE"。在最初的 运行 本身,当数据库 table 仍然是空的并且正在处理 csv 的第一行时,我的函数说条目已经存在并且 returns 是真的.

我怀疑我的查询有问题。任何人都可以提出建议吗?

myReader.Read() 不会从 SQL 查询中 return true 或 false。如果前进到下一条记录,则 return 为真,如果没有记录,则为假。

我们通常调用 .Read() 一次以前进到第一条记录(如果有的话),只要它 return 为真,我们就会一次又一次地调用,以便我们读取所有记录在结果集中。

要实际从 SqlDataReader 中读取结果,您需要调用 .Read() 一次以前进到第一个(唯一)记录,然后调用

result = myReader.GetBoolean(0) 

到return第一列的值return编辑为boolean

或者,由于查询只有 return 一个值(一行,一列),您可以跳过 reader 并执行

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

如果行数和列数较多,可以使用ExecuteScalar,但关键是return是第一行和第一列。