好日子,伙计们, 我正在使用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
在使用调试器运行时,我发现此函数在假设返回“FALSE”的位置返回“TRUE”。在初始运行本身,当数据库表仍然为空并且正在处理csv的第一行时,我的函数表示该条目已经存在并返回true。
我怀疑我的查询有问题。任何人都可以提出建议吗?
答案 0 :(得分:3)
myReader.Read()
不会从SQL查询返回true或false。如果它前进到下一条记录则返回true,如果没有记录则返回false。
我们通常会调用.Read()
一次前进到第一个记录(如果有的话),并且只要它返回true就会一次又一次地调用,以便我们读取结果集中的所有记录。
要实际读取SqlDataReader
的结果,您可以调用.Read()
一次以前进到第一个(唯一)记录,然后调用
result = myReader.GetBoolean(0)
返回以boolean
返回的第一列的值。
或者,由于查询只返回单个值(一行,一列),您可以跳过阅读器并执行
result = DirectCast(SQLCmd.ExecuteScalar(), Boolean)
如果有更多的行和列,您可以使用ExecuteScalar
,但重点是它只返回第一行和第一行。