【问题标题】:Read from two tables information从两个表中读取信息
【发布时间】:2022-01-21 16:58:30
【问题描述】:

如何转换此代码以从两个表中读取信息。

Private Sub GenerateDynamicUserControl()
    FlowLayoutPanel1.Controls.Clear()
    Dim dt As DataTable = New ClassBLL().GetItems()

    If dt IsNot Nothing Then

        If dt.Rows.Count > 0 Then
            Dim listItems As ListItem() = New ListItem(dt.Rows.Count - 1) {}

            For i As Integer = 0 To 1 - 1

                For Each row As DataRow In dt.Rows
                    Dim listItem As New ListItem()
                    listItems(i) = listItem
                    'Dim ms As New MemoryStream(CType(row("userPic"), Byte()))
                    listItems(i).Width = FlowLayoutPanel1.Width - 30
                    listItems(i).Icon = orderPicFromString
                    listItems(i).Icon2 = orderPicFromString2
                    listItems(i).OrderFrom = row("orderfrom").ToString()
                    listItems(i).OrderTitle = orderTitleString
                    listItems(i).OrderReceiver = row("orderreceiver").ToString()
                    listItems(i).OrderTitle2 = orderTitleString2
                    'listItems(i).ButtonBackground = orderButtonBackString
                    listItems(i).ButtonText = row("orderstatus").ToString()
                    listItems(i).OrderDate = row("orderdate")
                    listItems(i).IDOrder = row("orderid").ToString()

                    If listItems(i).ButtonText = "Accepted" Then
                        listItems(i).ButtonBackground = Color.FromArgb(26, 168, 92)
                    ElseIf listItems(i).ButtonText = "Declined" Then
                        listItems(i).ButtonBackground = Color.FromArgb(246, 50, 90)
                    ElseIf listItems(i).ButtonText = "Proceed" Then
                        listItems(i).ButtonBackground = Color.FromArgb(255, 174, 33)
                    ElseIf listItems(i).ButtonText = "Waiting" Then
                        listItems(i).ButtonBackground = Color.FromArgb(53, 121, 255)
                    Else
                        listItems(i).ButtonBackground = Color.FromArgb(91, 146, 255)
                    End If
                    FlowLayoutPanel1.Controls.Add(listItems(i))
                Next
            Next
        End If
    End If
End Sub

让我从 RED 中的相关信息开始,我需要从另一个名为“Profiles”的表中获取这些信息

listItems(i).Icon = orderPicFromString

listItems(i).Icon2 = orderPicFromString2

listItems(i).OrderTitle = orderTitleString

listItems(i).OrderTitle2 = orderTitleString2

所以我需要从“配置文件”表中读取这些字段

接下来就是你看到的代码调用Class GetItems:

Public Function GetItems() As DataTable
    Try
        Dim objdal As New ClassDAL()
        Return objdal.ReadItemsTable()
    Catch e As Exception
        Dim result As DialogResult = MessageBox.Show(e.Message.ToString())
        Return Nothing
    End Try
End Function

Public Function ReadItemsTable() As DataTable
    Using cons As New OleDbConnection(ServerStatus)
        Using cmd As New OleDbCommand()
            cmd.Connection = cons
            cmd.CommandText = "SELECT * FROM OrdersAssigned ORDER BY ID ASC"
            cons.Open()
            Using sda As New OleDbDataAdapter(cmd)
                Dim dt As New DataTable()
                sda.Fill(dt)
                Return dt
            End Using
        End Using
    End Using
End Function

所以这是显示 row("name") 的结果的主要函数 然后我尝试像这样创建:

'Declare Strings for OrderDisplay
Public orderFromString As String
Public orderTitleString As String
Public orderReceiveString As String
Public orderTitleString2 As String
Public orderButtonBackString As Color
Public orderButtonTextString As String
Public orderDateString As Date
Public orderIDString As String
Public orderPicFromString As Image
Public orderPicFromString2 As Image
'Get Accounts Name
Public orderAccountFrom As String
Public orderAccountTo As String

Public Sub GetUserPictureFrom()
    Using conn As New OleDbConnection(ServerStatus)
        conn.Open()
        Dim sql As String = "Select userPicture From Profiles where userAccount=@GetLogin"
        Using cmd As New OleDbCommand(sql, conn)
            cmd.Parameters.AddWithValue("@GetLogin", orderAccountFrom)
            Dim imageData As Byte() = DirectCast(cmd.ExecuteScalar(), Byte())
            If imageData IsNot Nothing Then
                Using stream As New MemoryStream(imageData)
                    Dim backgroundImage As Image = Image.FromStream(stream)
                    orderPicFromString = backgroundImage
                End Using
            End If
        End Using
    End Using
End Sub
Public Sub GetUserPictureTo()
    Using conn As New OleDbConnection(ServerStatus)
        conn.Open()
        Dim sql As String = "Select userPicture From Profiles where userAccount=@GetLogin"
        Using cmd As New OleDbCommand(sql, conn)
            cmd.Parameters.AddWithValue("@GetLogin", orderAccountTo)
            Dim imageData As Byte() = DirectCast(cmd.ExecuteScalar(), Byte())
            If imageData IsNot Nothing Then
                Using stream As New MemoryStream(imageData)
                    Dim backgroundImage As Image = Image.FromStream(stream)
                    orderPicFromString2 = backgroundImage
                End Using
            End If
        End Using
    End Using
End Sub

Public Sub GetOrdersDisplay()
    Using cons As New OleDbConnection(ServerStatus)
        Using cmd As New OleDbCommand()
            cmd.Connection = cons
            cmd.CommandText = "SELECT * FROM OrdersAssigned ORDER BY ID ASC"
            cons.Open()
            Using rdr As OleDbDataReader = cmd.ExecuteReader()
                While rdr.Read()
                    orderAccountFrom = rdr("orderacc").ToString
                    orderAccountTo = rdr("orderreceiveracc").ToString
                End While
            End Using
            cmd.CommandText = "Select userPosition From Profiles where userAccount = @GetUser"
            cmd.Parameters.Clear()
            cmd.Parameters.AddWithValue("@GetUser", orderAccountFrom)
            Using rds As OleDbDataReader = cmd.ExecuteReader()
                While rds.Read()
                    orderTitleString = rds("userPosition").ToString
                End While
            End Using
            cmd.CommandText = "Select userPosition From Profiles where userAccount = @ToUser"
            cmd.Parameters.Clear()
            cmd.Parameters.AddWithValue("@ToUser", orderAccountTo).ToString()
            Using rdx As OleDbDataReader = cmd.ExecuteReader()
                While rdx.Read()
                    orderTitleString2 = rdx("userPosition").ToString
                End While
            End Using
        End Using
    End Using
    GetUserPictureFrom()
    GetUserPictureTo()
End Sub

它需要做的是:

orderAccountFrom = rdr("orderacc").ToString

orderAccountTo = rdr("orderreceiveracc").ToString

将从表 OrdersAssigned 中获取帐户并在表 Profiles 中搜索以获取结果 userPosition 这是什么意思

个人资料中的 userx 具有 userPosition = Boss 个人资料中的 usery 有 userPosition = Worker 我想获取这些信息。 每个用户都有自己的图片也是如此。

我怎样才能设法解决这个问题以便获得正确的数据? 我如何在函数 ReadItemsTable() 中结合所有这些内容,最好将所有内容都放在一个地方

listItems(i).Icon = orderPicFromString

listItems(i).Icon2 = orderPicFromString2

listItems(i).OrderTitle = orderTitleString

listItems(i).OrderTitle2 = orderTitleString2

正确工作以获取信息

【问题讨论】:

  • 我对这个问题有点模糊,也许您可​​以展示使用您的数据库模式,以便我们更好地了解您的数据库结构。除此之外,也许您可​​以考虑使用带有连接条件的选择查询来一次性从两个表中检索所需的信息
  • 好的,你可以使用类似这样的东西 SELECT OrdersAssigned.orderacc, OrdersAssigned.orderfrom, Profiles.userName, Profiles.userPosition FROM OrdersAssigned INNER JOIN Profiles ON OrdersAssigned.orderfrom = Profiles.userName 作为查询的基础。但老实说,您的数据库结构中存在一些非常实际的基本问题,应该真正解决。不能强调这一点,适当的数据库设计和实现使上面的一切变得更容易
  • 我没有在您提供的上述查询中播种逻辑,如何帮助从表 Profiles 中获取 userPosition 和 userPicture 并在由 row("name") 调用的函数中使用它?
  • 只有这 2 件事我需要从另一个表中获取,其他所有内容都由函数中的 row("name") 显示,只需要在 (i) 中。获取用户名 -> 转到 Profiles 获取他的结果返回

标签: vb.net vb.net-2010


【解决方案1】:
cmd.CommandText = "SELECT OrdersAssigned.*,
              ProfilesFrom.userPosition AS UserPositionFrom,
              ProfilesFrom.userPicture AS UserPictureFrom,
              ProfilesTo.userPosition AS UserPositionTo,
              ProfilesTo.userPicture AS UserPictureTo
            FROM
              (OrdersAssigned
              LEFT OUTER JOIN Profiles AS ProfilesFrom ON OrdersAssigned.orderacc = ProfilesFrom.userAccount)
              LEFT OUTER JOIN Profiles AS ProfilesTo ON OrdersAssigned.orderreceiveracc = ProfilesTo.userAccount
            ORDER BY
              OrdersAssigned.ID ASC;"

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
  • 非常清楚地理解我用来修复它的方法是使用 JOIN 修复查询,然后在代码中调用易于理解的行 :)
猜你喜欢
  • 2019-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-06
  • 1970-01-01
  • 2013-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多