我有一组订单,每个订单都有一个所需的权重,还有一组火鸡,每个都有一个重量,都包含在数据库和数据集中,但是通过对象访问(这使得它更复杂,但对象是那里增加了项目的复杂性,而不是因为它是一个好主意)。
如何匹配它们,然后更新数据库和数据集?我正在尝试使用列表和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
答案 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,以使用数据集中的更改来更新数据库表。如果您在程序中使用类型化数据集,那么将更改提交到数据库将变得更容易。