循环遍历SqlDataReader两次返回同一行

时间:2016-04-29 18:35:06

标签: vb.net sqldatareader

我正在制作一个VB.NET(4.6)Windows窗体应用程序,它可以收集我们服务器上的信息并允许我们对其进行报告。它很好地融合在一起,但我遇到了一个我无法弄清楚的问题。该项目的一部分是一个服务,它从WSUS查询有关可用Windows更新的信息,然后将它们存储在SQL数据库中 - 该部分工作正常。我现在尝试使用SqlDataReader在DataGridView中显示此数据,以从数据库中查询信息并使用响应填充DataTable。问题是,当我使用阅读器时,它会将相同的记录放在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而不是开发者......

2 个答案:

答案 0 :(得分:2)

试试这个:

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两次。

答案 1 :(得分:0)

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

获取此输出并运行它是SSMS

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