Vb.net 通过SqlDataReader循环两次返回同一行

Vb.net 通过SqlDataReader循环两次返回同一行,vb.net,sqldatareader,Vb.net,Sqldatareader,我正在制作一个VB.NET(4.6)Windows窗体应用程序,它在我们的服务器上收集信息,并允许我们对其进行报告。这一切进展顺利,但我遇到了一个无法解决的问题。该项目的一部分是一个服务,它可以从WSUS查询可用Windows更新的信息,然后将它们存储在SQL数据库中—这部分工作正常。我现在尝试使用SqlDataReader在DataGridView中显示这些数据,以查询数据库中的信息,并用响应填充DataTable。问题是,当我使用读卡器时,它会将同一条记录放在数据表中两次。我不确定我做错了什

我正在制作一个VB.NET(4.6)Windows窗体应用程序,它在我们的服务器上收集信息,并允许我们对其进行报告。这一切进展顺利,但我遇到了一个无法解决的问题。该项目的一部分是一个服务,它可以从WSUS查询可用Windows更新的信息,然后将它们存储在SQL数据库中—这部分工作正常。我现在尝试使用SqlDataReader在DataGridView中显示这些数据,以查询数据库中的信息,并用响应填充DataTable。问题是,当我使用读卡器时,它会将同一条记录放在数据表中两次。我不确定我做错了什么,我确定这是一件非常简单的事情。也许你们中的一个人能发现这个问题

注意:在应用程序的前面部分,updateid作为唯一字符串存储在名为DbUpdateId列表的列表中,结果存储在名为dbupTable的DataTable中,我尝试更新的datagridview名为UpdateDetsView

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而不是开发人员。

没有读卡器。读卡器无法移动到下一条记录

获取此文件的输出并运行它,即SSMS

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

没有
路读卡器。读卡器无法移动到下一条记录

获取此文件的输出并运行它,即SSMS

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

Public子getUpdateDetails()
Dim sql作为字符串=\u
“选择不同的upTableId、标题、分类、描述、发布日期,&”_
“严重性、文章编号、url”&_
“来自updatedetails”和
“其中updateid=@updateid”
将cn用作新的SqlClient.SqlConnection(connectionString)_
cmd作为新的SqlClient.SqlCommand(sql,cn)
cmd.Parameters.Add(“@updateID”,SqlDbType.Int).Value=Int32.Parse(dbupdateId.First())
cn.Open()
UpdateDetsView.DataSource=cmd.ExecuteReader()
终端使用
端接头
注意使用了DISTINCT,并且完全没有任何显式循环

还要注意,我只查看了
dbupdateidlist
中的一个条目。旧bug的真正来源可能是该列表中的ID出现了两次

试试这个:

Public子getUpdateDetails()
Dim sql作为字符串=\u
“选择不同的upTableId、标题、分类、描述、发布日期,&”_
“严重性、文章编号、url”&_
“来自updatedetails”和
“其中updateid=@updateid”
将cn用作新的SqlClient.SqlConnection(connectionString)_
cmd作为新的SqlClient.SqlCommand(sql,cn)
cmd.Parameters.Add(“@updateID”,SqlDbType.Int).Value=Int32.Parse(dbupdateId.First())
cn.Open()
UpdateDetsView.DataSource=cmd.ExecuteReader()
终端使用
端接头
注意使用了DISTINCT,并且完全没有任何显式循环



还要注意,我只查看了
dbupdateidlist
中的一个条目。旧bug的真正来源可能是该列表中的ID出现了两次

不需要将行逐个移动到数据表中
dbupTable.Load(readerObj.ExecuteReader)
将为您填充表格。如果您在其他地方有这个表,您可以使用它的数据视图。但无论如何,请启用选项“严格”,即使只是SA,也要始终使用参数以避免SQL注入和格式问题。
dbupdateidlist
是否包含重复的值?这不是SQL server的问题,请正确使用标记。@puropoix感谢您的提示!但是,我用dbupTable.Load(cmdObj.ExecuteReader)替换了整个While循环,它仍然显示了两个结果。Option Strict会为我做什么?不需要将行逐个移动到数据表中
dbupTable.Load(readerObj.ExecuteReader)
将为您填充表格。如果您在其他地方有这个表,您可以使用它的数据视图。但无论如何,请启用选项“严格”,即使只是SA,也要始终使用参数以避免SQL注入和格式问题。
dbupdateidlist
是否包含重复的值?这不是SQL server的问题,请正确使用标记。@puropoix感谢您的提示!但是,我用dbupTable.Load(cmdObj.ExecuteReader)替换了整个While循环,它仍然显示了两个结果。选项Strict会为我做什么?你可能误解了我的问题,它返回两行,而只有一行存在。我在SMSS中运行了它,得到了一个结果,但是如果它是由读卡器运行的,我在DataGridView中会得到两次相同的行。@user1806800该图像不能证明循环返回了两行。在调试模式下跟踪它,若查询返回一行,它就不可能循环两次。敲打,敲打-如果你调用它两次,你就会得到结果。@user1806800我会再次检查只有一行存在的假设sknock,敲打。您可以声明“通过SqlDataReader循环返回同一行两次”。这是错误的。循环不会两次返回同一行。如果它被调用两次,那么你调用它两次。答案是肯定的,你做错了什么-这个循环做的正是它应该做的。那是什么呢?再说一遍,你只是说我做错了什么,没有提供任何建议或可能的解决方案。很明显,我来这里知道我做错了什么。如果我问的问题不正确,建议一个替代方案或不回答,这只是浪费我们的时间。你可能误解了我的问题,它返回两行,而只有一行存在。我在SMSS中运行了它,得到了一个结果,但是如果它是由读卡器运行的,我在DataGridView中会得到两次相同的行。@user1806800该图像不能证明循环返回了两行。在调试模式下跟踪它,若查询返回一行,它就不可能循环两次。敲打,敲打-如果你调用两次,你就会得到结果。@user1806800我会再次检查假设只有一行存在