提问人:roy 提问时间:8/2/2023 更新时间:8/7/2023 访问量:70
如何使用 vb.net 从第二个源数据表查找到第一个数据表
How to lookup from the second source datatable to the first datatable with vb.net
问:
如何使用 vb.net 从第二个源数据表查找到第一个数据表。
如果可能,是否可以应用查找数据表?请指导我
谢谢
Private table1 As New DataTable
Private table2 As New DataTable
Protected Overrides Sub OnLoad(e As EventArgs)
MyBase.OnLoad(e)
'_myTable = New DataTable
table1.Columns.AddRange({
New DataColumn("Column1", GetType(String)),
New DataColumn("Column2", GetType(String)),
New DataColumn("Column3", GetType(String)),
New DataColumn("Size", GetType(String)),
New DataColumn("Qty", GetType(Integer))
})
table1.Rows.Add("TEST 3000", "TEST", "BHTF10", "5L", 25)
table1.Rows.Add("TEST 2000", "TEST", "BHTF15", "S", 55)
table1.Rows.Add("TEST 3000", "TEST", "BHTF10", "M", 65)
table1.Rows.Add("TEST 1000", "TEST", "BHTF25", "6L", 10)
table1.Rows.Add("TEST 3000", "TEST", "BHTF10", "S", 12)
DataGridView1.DataSource = table1
End Sub
Private Sub createtabletwo()
table2.Columns.AddRange({
New DataColumn("Size", GetType(String)),
New DataColumn("SizePriority", GetType(Integer))
})
table2.Rows.Add("5L", 13)
table2.Rows.Add("S", 2)
table2.Rows.Add("M", 3)
table2.Rows.Add("6L", 15)
table2.Rows.Add("3L", 9)
End Sub
期望的结果
列 1 | 专栏 2 | 专栏 3 | 大小 | 数量 | 大小优先级 |
---|---|---|---|---|---|
测试 3000 | 测试 | BHTF10型 | 5升 | 25 | 13 |
测试 2000 | 测试 | BHTF15型 | S | 55 | 2 |
测试 3000 | 测试 | BHTF10型 | M | 65 | 3 |
测试 1000 | 测试 | BHTF25型 | 6升 | 10 | 15 |
测试 3000 | 测试 | BHTF10型 | S | 12 | 2 |
答:
1赞
Hursey
8/7/2023
#1
如果只想使用一个简单的决策树,那就没什么太复杂的了。事实上,我几乎可以说,看看你之前发布的问题和答案,你已经知道如何做到这一点,你需要实际应用别人给你的逻辑和学习。Select Case
Dim table1 As New DataTable("Players")
table1.Columns.Add(New DataColumn("ProductCode", GetType(String)))
table1.Columns.Add(New DataColumn("Remark", GetType(String)))
table1.Columns.Add(New DataColumn("ColorCode", GetType(String)))
table1.Columns.Add(New DataColumn("Size", GetType(String)))
table1.Columns.Add(New DataColumn("Qty", GetType(Integer)))
table1.Columns.Add(New DataColumn("SizePriority", GetType(Integer)))
table1.Rows.Add("TEST 3000", "TEST", "BHTF10", "5L", 25)
table1.Rows.Add("TEST 2000", "TEST", "BHTF15", "S", 55)
table1.Rows.Add("TEST 3000", "TEST", "BHTF10", "M", 65)
table1.Rows.Add("TEST 1000", "TEST", "BHTF25", "6L", 10)
table1.Rows.Add("TEST 3000", "TEST", "BHTF10", "S", 12)
For Each row As DataRow In table1.Rows
Select Case row("Size").ToString()
Case "XS"
row("SizePriority") = 1
Case "S"
row("SizePriority") = 2
Case "M"
row("SizePriority") = 3
Case "L"
row("SizePriority") = 4
Case "XL"
row("SizePriority") = 5
Case "XXL"
row("SizePriority") = 6
Case "2L"
row("SizePriority") = 7
Case "3L"
row("SizePriority") = 8
Case "4L"
row("SizePriority") = 9
Case "5L"
row("SizePriority") = 10
Case Else
row("SizePriority") = 11
End Select
row.AcceptChanges()
Next
Dim table1View As New DataView(table1)
table1View.Sort = "ProductCode Desc, ColorCode, SizePriority"
For Each row As DataRowView In table1View
Console.WriteLine($"{row(0)}, {row(1)}, {row(2)}, {row(3)}, {row(4)}, {row(5)}")
Next
没有什么比这更复杂的了。当然,您可以使用 lamda/linq 表达式来执行此操作,但这是一种冗长的方法。替代方案,由于 SizePriority 表在现实生活中可能较小(我猜),因此切换它可能是更好的性能。迭代 Size Priority 表,使用 Where 子句更新 Table1。我现在对它的确切语法有点模糊,所以要把它留在那里,如果你想研究它,这取决于你。
如果您希望将其作为数据库中的查询来执行,则只需一个简单的联接即可。没有比这更复杂的了,您甚至可以考虑在该查询上使用 Order By 子句,这将使这个问题和上一个问题变得多余。
Select
<order>.Code,
<order>.Name,
<order>.ColorCode,
<order>.Size,
<order>.Quantity,
<SizePriority>.Priority
From <Order>
Inner Join <SizePriority> ON <SizePriority>.Size = <Order>.Size
Order By Code Desc, ColorCode, Priority
请注意,我不知道您的数据库架构,因此我使用了 并且作为占位符,您需要将它们替换为您的实际表名,无论它们是什么。您可能还需要一些 where 条件来过滤结果。<order>
<SizePriority>
评论
0赞
roy
8/7/2023
谢谢根据我想要的回答。对不起,我回复晚了
评论
[DataTable1].Merge([DataTable2], false, MissingSchemaAction.AddWithKey)
MissingSchemaAction.Add
table1.Merge([table2], False, MissingSchemaAction.AddWithKey) DataGridView1.DataSource = table1
New DataColumn("Item_Id", GetType(Long)) With {.AutoIncrement = True, .AutoIncrementSeed = 0, .AutoIncrementStep = 1}
table1.PrimaryKey = {table1.Columns("Item_Id")}
table1.Rows.Add("TEST 3000", "TEST", "BHTF10", "5L", 25)
Additional information: Input string was not in a correct format.Couldn't store <TEST 3000> in Item_Id Column. Expected type is Int64.
Nothing
.Rows.Add()