0

大家好,我正在使用 VB.Net 开发一个 Windows 窗体应用程序。我的应用程序的 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

在使用调试器运行时,我发现这个函数在它应该返回“FALSE”的地方返回“TRUE”。在初始运行本身中,当数据库表仍然为空并且正在处理 csv 的第一行时,我的函数说该条目已经存在并返回 true。

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

4

1 回答 1

3

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

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

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

result = myReader.GetBoolean(0) 

返回以 a 形式返回的第一列的值boolean

或者,由于查询只返回一个值(一行,一列),您可以跳过阅读器并执行

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

如果有更多的行和列,您可以使用ExecuteScalar,但关键是它只返回第一行和第一列。

于 2018-01-18T00:51:16.913 回答