2017-10-19 124 views
0

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

在此先感谢

+1

您应该将设置为'Option Strict On'。那个“SQL Helper”也必须导致很多数据类型转换。可以查询数据表,因此除非有许多行,否则可以这样做,而不是为每行都运行新的查询。 – Plutonix

+0

如果您使用的是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),您可以使用它来将整个数据表传递给存储过程并批量处理。 –

回答

1

您可以使用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() 
+0

这很有趣。谢谢。我不知道DataView构造函数以及它可以做什么。 – robinobrien76