【问题标题】:Compare 2 datasets (one to many rows)比较 2 个数据集(一对多行)
【发布时间】:2018-04-01 02:33:14
【问题描述】:

VB.NET Winforms

我需要比较 2 个数据表(每个数据表都在自己的数据集中)并得出 OK 或 NG 的判断,一个是参考表,另一个是来自机器的原始数据。一个表会有一行有一个数量,另一个表会有多行来匹配那个数量,希望如此。此处的目的是验证紧固件的扭矩值。这里的第一个表是我将获得的数据,作为扭矩传递所需的数据。我们称这张表为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 将是两个数据集之间的公共列。

让我们以最后一行为例。最后一行告诉我,我需要从 NINDEX 12 获得 2 个扭矩,其值在 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,dtTorquesRequired中NTORQUE_VALEU必须在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

如何在不使用 SQL 的情况下使用 VB.NET 在本地查询数据表对象

提前致谢

【问题讨论】:

  • 你应该设置Option Strict On。该“SQL Helper”也必须导致许多数据类型转换。可以查询数据表,因此除非有很多行,否则您可以这样做,而不是为每一行运行一个新查询。
  • 如果您使用的是sql server 2008及以上版本,则可以使用Table-Value Parameters,您可以将整个数据表传递给存储过程并批量处理。

标签: vb.net winforms dataset


【解决方案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()

【讨论】:

  • 这很有趣。谢谢你。我没有意识到DataView构造函数以及它可以做的事情。 span>
猜你喜欢
  • 2012-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
相关资源
最近更新 更多