循环遍历 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 两次。
我正在制作一个 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 两次。