比较2个集(一对多行)
VB.NET的WinForms比较2个集(一对多行)
我需要比较2个数据表(即各自己的数据集内),并与正常或异常的判断得出结论,一个是参考表另一个是机器的原始数据。一张桌子上会有一行有数量,另一张桌子会有多行以匹配那个数量,希望。这里的目的是验证紧固件的扭矩值。这里的第一个表格是我将得到的数据,作为扭矩传递所需的数据。让我们把这个表dtTorquesRequired
:
NINDEX NQTY_REQ NMIN NMAX
7 1 33.0 59.0
8 4 33.0 59.0
9 2 4.5 7.5
12 2 4.5 7.5
参数nIndex将是2个数据集之间的公共列。
我们以最后一行为例。最后一行告诉我,我需要从NINDEX 12中获得两个扭矩,其值在4.5 - 7.5之间。
这是我必须判断的数据。让我们把这个表dtTorquesPerformed
:
NINDEX NTORQUE_NO NTORQUE_STATUS NTORQUE_VALUE
7 1 1 42.56
8 1 1 42.22
8 2 1 42.49
8 3 1 42.10
8 4 1 42.37
9 1 1 7.01
9 2 1 7.10
12 1 1 5.68
12 2 1 5.81
判断需要有2个表之间的参数nIndex比赛,NTORQUE_STATUS必须是1,和NTORQUE_VALEU必须dtTorquesRequired在nMin和NMAX之间。
现在,我正在使用只有SQL行计数结果的应用程序中执行此操作,但速度很慢。我正在通过多个简单的调用来完成它,而不是对数据库进行粗调,然后使用结果数据集。
这就是我目前的做法,但速度很慢。我想要做本地所有的处理,而不是使用SQL:
Private Function TorqueJudgement(ckanban As String) As Boolean
Dim ccode As String
Dim cline As String
Dim dsTorquesRequired As New DataSet
Dim dtTorquesRequired As New DataTable
Dim AreAllTorquesGood As Boolean = False
Dim BadTorqueCount As Int16 = 0
ccode = ckanban.Substring(0, 5)
cline = ckanban.Substring(5, 2)
SQL.ExecQuery("SELECT ....") ''GETS DTTORQUESREQUIRED
dsTorquesRequired = SQL.SQLDS
dtTorquesRequired = dsTorquesRequired.Tables(0)
dtTorquesRequired.Columns.Add("PassFail")
Dim rc As Int16 = -1 '//
For Each dr As DataRow In dsTorquesRequired.Tables(0).Rows
rc += 1
Dim nindex As Int16 = dr("NINDEX")
Dim qtyrequired As Int16 = dr("NQTY_REQ")
Dim nmin As Decimal = dr("NMIN")
Dim nmax As Decimal = dr("NMAX")
SQL.AddParam("@CKANBAN", ckanban)
SQL.AddParam("@NINDEX", nindex)
SQL.AddParam("@QTY_REQ", qtyrequired)
SQL.AddParam("@NMIN", nmin)
SQL.AddParam("@NMAX", nmax)
SQL.ExecQuery("SELECT ...") ''Searches for rows that match dtTorquesRequired
dtTorquesRequired.Rows(rc)("PassFail") = SQL.RecordCount
If Not dtTorquesRequired.Rows(rc)("NQTY_REQ") <= dtTorquesRequired.Rows(rc)("PassFail") Then
BadTorqueCount += 1
End If
Next
If BadTorqueCount > 0 Then
AreAllTorquesGood = False
ElseIf BadTorqueCount = 0 Then
AreAllTorquesGood = True
End If
Return AreAllTorquesGood
End Function
我如何可以查询DataTable对象在本地使用VB.NET,而不使用SQL
在此先感谢
您可以使用DataView
对象“查询”DataTables
:
Dim dtb As New DataTable
dtb.Columns.Add("Col0")
dtb.Columns.Add("Col1")
dtb.Columns.Add("Col2")
dtb.Columns.Add("Col3")
dtb.Rows.Add("R0C0", "R0C1", "A", "A")
dtb.Rows.Add("R1C0", "R1C1", "A", "A")
dtb.Rows.Add("R2C0", "R2C1", "A", "B")
dtb.Rows.Add("R3C0", "R3C1", "B", "B")
Dim dvw As New DataView(dtb)
dvw.RowFilter = "Col0>'R1C0'" 'WHERE
dvw.Sort = "Col2 DESC" 'ORDER BY
For Each drv As DataRowView In dvw
Dim drw As DataRow = drv.Row
Console.WriteLine(drw("Col0") & " " & drw("Col1") & " " & drw("Col2") & " " & drw("Col3"))
Next
Dim dtbDistinct As DataTable = dtb.DefaultView.ToTable(True, {"Col2", "Col3"}) 'DISTINCT
For Each drw As DataRow In dtbDistinct.Rows
Console.WriteLine(drw("Col2") & " " & drw("Col3"))
Next
Console.ReadKey()
这很有趣。谢谢。我不知道DataView构造函数以及它可以做什么。 – robinobrien76
您应该将设置为'Option Strict On'。那个“SQL Helper”也必须导致很多数据类型转换。可以查询数据表,因此除非有许多行,否则可以这样做,而不是为每行都运行新的查询。 – Plutonix
如果您使用的是sql server 2008及更高版本,则可以使用[Table-Value Parameters](https://docs.microsoft.com/zh-cn/dotnet/framework/data/adonet/sql/table-valued-parameters #created-table-valued -value-parameter-types),您可以使用它来将整个数据表传递给存储过程并批量处理。 –