循环遍历 SqlDataReader returns 同一行两次

Looping through SqlDataReader returns same row twice

我正在制作一个 VB.NET (4.6) Windows 表单应用程序,用于收集我们服务器上的信息并允许我们对其进行报告。它很好地结合在一起,但我 运行 遇到了一个我无法弄清楚的问题。该项目的一部分是一项服务,它从 WSUS 查询有关可用 Windows 更新的信息,然后将它们存储在 SQL 数据库中 - 这部分工作正常。我现在正尝试使用 SqlDataReader 在 DataGridView 中显示此数据,以从数据库中查询信息并用响应填充 DataTable。问题是,当我使用 reader 时,它会将同一条记录放入 DataTable 两次。我不确定我做错了什么,而且我确定这是非常简单的事情。也许你们中的一个人可以发现问题?

注意:在应用程序的早期,updateid 作为唯一字符串存储在名为 dbupdateidlist 的列表中,结果存储在名为 dbupTable 的 DataTable 中,我尝试更新的 datagridview 称为 UpdateDeetsView。

Public Sub getUpdateDetails()

    For Each str As String In dbupdateidlist
        Dim commGetUpdateDetails As String = "select upTableId, title, classification, description, " +
        "releasedate, severity, articlenumber, url from updatedetails where updateid = '" + str + "'"
        Using connObj As New SqlClient.SqlConnection(connectionString)
            Using cmdObj As New SqlClient.SqlCommand(commGetUpdateDetails, connObj)
                connObj.Open()
                Using readerObj As SqlClient.SqlDataReader = cmdObj.ExecuteReader
                    While readerObj.Read

                        dbuptabid = readerObj("uptableid")
                        dbuptitle = readerObj("title")
                        dbupclass = readerObj("classification")
                        dbupdesc = readerObj("description")
                        dbupreleasedate = readerObj("releasedate")
                        dbupseverity = readerObj("severity")
                        dbuparticlenumber = readerObj("articlenumber")
                        dbupurl = readerObj("url")

                        row = dbupTable.NewRow()
                        row("uptableid") = dbuptabid
                        row("title") = dbuptitle
                        row("classification") = dbupclass
                        row("description") = dbupdesc
                        row("releasedate") = dbupreleasedate
                        row("severity") = dbupseverity
                        row("articlenumber") = dbuparticlenumber
                        row("url") = dbupurl
                        dbupTable.Rows.Add(row)
                    End While

                End Using
                connObj.Close()
            End Using
        End Using
    Next
    UpdateDeetsView.DataSource = dbupTable
End Sub

请原谅可能很糟糕的代码,我是 SA 不是开发人员...

没有方式readerObj.Read无法移动到下一条记录

得到这个的输出 运行 它是 SSMS

"select upTableId, title, classification, description, " +  
"releasedate, severity, articlenumber, url from updatedetails where updateid = '" + str + "'"

试试这个:

Public Sub getUpdateDetails()
    Dim sql As String = _    
        "SELECT DISTINCT upTableId, title, classification, description, releasedate, " & _
            " severity, articlenumber, url " & _
       " FROM updatedetails " & _ 
       " WHERE updateid = @updateID"

    Using cn  As New SqlClient.SqlConnection(connectionString), _
          cmd As New SqlClient.SqlCommand(sql, cn)

        cmd.Parameters.Add("@updateID", SqlDbType.Int).Value = Int32.Parse(dbupdateidlist.First())
        cn.Open()
        UpdateDeetsView.DataSource = cmd.ExecuteReader()
    End Using
End Sub

请注意 DISTINCT 的使用,并且完全没有任何显式循环。

另请注意,我只查看 dbupdateidlist 中的一个条目。您的旧错误的真正来源可能是该列表中的 ID 两次。