如何将订单与产品匹配?

时间:2013-02-26 01:18:59

标签: database vb.net linq list dataset

我有一组订单,每个订单都有一个所需的权重,还有一组火鸡,每个都有一个重量,都包含在数据库和数据集中,但是通过对象访问(这使得它更复杂,但对象是那里增加了项目的复杂性,而不是因为它是一个好主意)。

如何匹配它们,然后更新数据库和数据集?我正在尝试使用列表和LINQ,但它不能很好地工作。不幸的是,我无法看到我出错的地方。 编辑:这条线     For Count = 0 To Max - 1 Orders.UpdateOrder(Count, Count + 1, Orders.OrderDetail(Count, "CustomerID"), TurkeyList(Count)(0), Orders.OrderDetail(Count, "ApproxWeight")) Next索引超出范围错误。我知道这意味着什么,但我不知道为什么我会得到它,以及如何解决它。

我已经完成了我的研究 - 实际上,我目前的尝试使用了一个列表(我从未听说过,直到我读到我可以在StackOverflow上使用它们)但是,这个,这不是我曾经做过的事情教,我可以使用一些指导。我最初尝试使用二维数组,但没有用。我认为我当前的实现应该有效 - 所以我很有可能错过了一些愚蠢的东西。 以下是我的代码的相关部分。

Imports System.Linq
# <summary>
#  SortForm is a public class which handles the events and controls of a single form.
#  </summary>
#  <remarks></remarks>
Public Class SortForm
    Dim Turkeys As New TurkeyDBInteract
    Dim Orders As New OrderDBInteract
    Dim Customers As New CustomerDBInteract
    Public TurkeyList As New List(Of Integer())
    Public OrderList As New List(Of Integer())
    #  <summary>
    #  The FillLists subroutine fills the two lists with data from the dataset.
    #  </summary>
    #  <remarks></remarks>
    Public Sub FillLists()
        For Count = 0 To Orders.OrderNum - 1
            OrderList.Add(New Integer() {Count, Orders.OrderDetail(Count, "ApproxWeight")})
        Next
        For Count = 0 To Turkeys.TurkeyNum - 1
            TurkeyList.Add(New Integer() {Count, Turkeys.TurkeyDetail(Count, "Weight")})
        Next
    End Sub
    #  <summary>
    #  The SortList subroutine takes a List of 1-dimensional integer and sorts it using LINQ to Objects.
    #  </summary>
    #  <param name="List"></param>
    #  <remarks></remarks>
    Public Sub SortList(ByRef List As List(Of Integer()))
        Dim SortedList As New List(Of Integer())
        SortedList = List.OrderBy(Function(Weight) Weight(1)).ToList()
        List = SortedList
    End Sub
    #  <summary>
    #  This is the SortButton click event. This calls the <see cref="FillLists"/> and <see cref="SortList"/> subroutines to process order and turkey data, then matches the lists and uses this to update the dataset and database.
    #  </summary>
    #  <param name="sender"></param>
    #  <param name="e"></param>
    #  <remarks></remarks>
    Private Sub SortButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SortButton.Click
        FillLists()
        SortList(TurkeyList)
        SortList(OrderList)
        Dim Max As Integer
        If TurkeyList.Count > OrderList.Count Then
            Max = OrderList.Count
        Else
            Max = TurkeyList.Count
        End If
        For Count = 0 To Max - 1
            Orders.UpdateOrder(Count, Count + 1, Orders.OrderDetail(Count, "CustomerID"), TurkeyList(Count)(0), Orders.OrderDetail(Count, "ApproxWeight"))
        Next
   End Sub
End Class

以下是OrderDBInteract类

中OrderUpdate方法的代码
    # <summary>
    # Subroutine UpdateOrder updates every value of a specific record of the OrderTbl dataset table and then updates the database.
    # </summary>
    # <param name="Row">Row passes the row of the record to be updated.</param>
    # <param name="OrderID">OrderID passes the new primary key value of the record to be updated.</param>
    # <param name="CustomerID">CustomerID passes the new foreign key field value of the record to be updated.</param>
    # <param name="ApproxWeight">ApproxWeight passes a new field value of the record to be updated.</param>
    # <remarks></remarks>
    Public Sub UpdateOrder(ByVal Row, ByVal OrderID, ByVal CustomerID, ByVal TurkeyID, ByVal ApproxWeight)
        Data.Tables("OrderTbl").Rows(Row).Item("OrderID") = OrderID
        Data.Tables("OrderTbl").Rows(Row).Item("CustomerID") = CustomerID
        Data.Tables("OrderTbl").Rows(Row).Item("TurkeyID") = TurkeyID
        Data.Tables("OrderTbl").Rows(Row).Item("ApproxWeight") = ApproxWeight
    End Sub

1 个答案:

答案 0 :(得分:1)

尝试根据键对值进行排序的sortedlist。例如:

Dim OrderList As New SortedList
    For Count = 0 To Orders.OrderNum - 1
        OrderList.Add(Orders.OrderDetail(Count, "ApproxWeight"), Count)
    Next

将根据Orders.OrderDetail的结果对值(Count)进行排序。这样你就不需要调用SortList方法。

虽然,这个

Data.Tables("OrderTbl").Rows(Row).Item("OrderID") = OrderID

确实更改了数据集表中Row的OrderID列值,这些更改不会提交到数据库。看看这个msdn walkthrough 关于将数据保存到数据库。基本上,您需要一个具有相应UpdateCommand设置的DataAdapter,以使用数据集中的更改来更新数据库表。如果您在程序中使用类型化数据集,那么将更改提交到数据库将变得更容易。