【问题标题】:Duplicates when doing select in a database and showing it in a table在数据库中进行选择并将其显示在表中时重复
【发布时间】:2019-06-08 12:11:27
【问题描述】:

实际上我是 ASPX 和 VB.net 的新手,我正在尝试在表格中为特定用户显示某些项目,所以首先我检查并将用户购买的“软件”放入列表中在数据库中看起来像这样:

table_username: User1 table_codesoftware: VP or table_username: User2 table_codesoftware: VP and table_username User2 table_codesoftware VPO。

因此,当用户 2 有权访问软件 VP 和 VPO 时,用户 1 只能访问数据库中具有 VP 作为软件代码的软件。

但是当我尝试为 User2 显示项目时,它会显示两倍于代码 VP 的软件。

这是我的 VB.NET 代码,其中我有一个 SELECT,其中 aggiornamenti 是所有软件的表,dat("codesw_cs") 是可供用户软件使用的列表。

   Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    Dim result As New ArrayList()
    Dim table As New StringBuilder()

    Dim SQL As String = "SELECT codesw_cs FROM clienti_sw WHERE nomeutente_cs = '" + Context.User.Identity.Name + "'"

    Dim SQLConnect As String = ConfigurationManager.ConnectionStrings("myConnectionString").ConnectionString

    Dim con As New MySqlConnection(SQLConnect)

    Dim reader As MySqlDataReader

    Dim cmd = New MySqlCommand(SQL, con)

    Try
        table = New StringBuilder()
        con.Open()


        reader = cmd.ExecuteReader()
        While reader.Read()

            Dim dict As New Dictionary(Of String, Object)
            For count As Integer = 0 To (reader.FieldCount - 1)
                dict.Add(reader.GetName(count), reader(count))
            Next


            result.Add(dict)
        End While
        reader.Close()

        con.Close()

    Catch ex As Exception
        MsgBox("Can't load Web page" & vbCrLf & ex.Message)
    End Try

    For Each dat As Dictionary(Of String, Object) In result
        con.Open()
        Dim msd = New MySqlCommand("SELECT * FROM aggiornamenti WHERE softcode_ag = '" + dat("codesw_cs") + "'", con)

        reader = msd.ExecuteReader()

        While reader.Read()
            table.Append("<tr>")
            table.Append("<td>").Append(reader.GetString("nomesoftware_ag")).Append("</td>")
            table.Append("<td>").Append(reader.GetString("version_ag")).Append("</td>")
            table.Append("<td>").Append(Date.Parse(reader.GetString("releasedata_ag")).ToShortDateString).Append("</td>")
            table.Append("<td>").Append("<a href=""" + reader.GetString("download_ag") + """ aria-disabled=""true"">Download</a></td>")
            table.Append("</tr>")

        End While
        placeholder.Controls.Add(New LiteralControl(table.ToString))

        reader.Close()

        con.Close()


    Next


End Sub

【问题讨论】:

  • 可能会发生一些事情。查询是否返回重复?您是否正确清除表变量? For Each 循环可以创建重复条目吗?你可以通过设置断点来解决。现在,在 For Each 的第二个循环中,“table”变量仍将包含前一个循环的值。
  • @the_lotus 实际上我还没有进行调试,关键是在第一个 dat("codesw_cs") 是副总裁,而在它添加正确的项目时,甚至在第二个对于循环,dat 值是 VPO,它只为 VPO 添加项目并从 for 中退出,所以我无法找到它的重复位置..
  • @the_lotus 我刚刚从 Page_load 添加了整个代码
  • 将“table = New StringBuilder()”放入For Each
  • 除非您要求,否则变量不会自行清理。

标签: mysql asp.net vb.net


【解决方案1】:

您需要在每个循环中清除表变量。如果没有,第二次循环,它会继续追加到变量中。

For Each dat As Dictionary(Of String, Object) In result
  table = New StringBuilder()

【讨论】:

  • 再想一想,因为我是 VB 新手,所以我通过这种方式制作表格是否正确?
  • @JohnKarry 这是主观的,有些人可能会使用 DataGrid 或 Repeater。但首先,使用参数而不是将变量附加到查询中。然后,处理可能包含 html/javascript 的字符串的情况(例如:如果 omesoftware 包含
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 2013-03-17
  • 1970-01-01
  • 2013-08-08
  • 1970-01-01
  • 2021-12-01
相关资源
最近更新 更多