Vb.net 通过SqlDataReader循环两次返回同一行
我正在制作一个VB.NET(4.6)Windows窗体应用程序,它在我们的服务器上收集信息,并允许我们对其进行报告。这一切进展顺利,但我遇到了一个无法解决的问题。该项目的一部分是一个服务,它可以从WSUS查询可用Windows更新的信息,然后将它们存储在SQL数据库中—这部分工作正常。我现在尝试使用SqlDataReader在DataGridView中显示这些数据,以查询数据库中的信息,并用响应填充DataTable。问题是,当我使用读卡器时,它会将同一条记录放在数据表中两次。我不确定我做错了什么,我确定这是一件非常简单的事情。也许你们中的一个人能发现这个问题 注意:在应用程序的前面部分,updateid作为唯一字符串存储在名为DbUpdateId列表的列表中,结果存储在名为dbupTable的DataTable中,我尝试更新的datagridview名为UpdateDetsViewVb.net 通过SqlDataReader循环两次返回同一行,vb.net,sqldatareader,Vb.net,Sqldatareader,我正在制作一个VB.NET(4.6)Windows窗体应用程序,它在我们的服务器上收集信息,并允许我们对其进行报告。这一切进展顺利,但我遇到了一个无法解决的问题。该项目的一部分是一个服务,它可以从WSUS查询可用Windows更新的信息,然后将它们存储在SQL数据库中—这部分工作正常。我现在尝试使用SqlDataReader在DataGridView中显示这些数据,以查询数据库中的信息,并用响应填充DataTable。问题是,当我使用读卡器时,它会将同一条记录放在数据表中两次。我不确定我做错了什
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我会再次检查假设只有一行存在