我正在制作一个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而不是开发者......
答案 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 + "'"