2017-10-19 56 views
0

VB.NET Winforms2 ensembles de données (une à plusieurs lignes)

je dois comparer 2 datatables (qui sont chacun dans leur propre ensemble de données) et conclure avec un arrêt de OK ou NG, on est une table de référence , l'autre est des données brutes d'une machine. Une table aurait une ligne avec une QTY, l'autre table aurait plusieurs lignes pour correspondre à cette QTÉ, j'espère. Le but ici est de vérifier les valeurs de couple sur les fixations. Le premier tableau ici est les données que je recevrais comme ce qui serait nécessaire pour que les couples passent. Appelons cette table 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 sera la colonne commune entre les 2 ensembles de données.

Utilisons la dernière ligne comme exemple. La dernière rangée me dit que j'ai besoin de 2 couples de NINDEX 12 avec une valeur entre 4.5 - 7.5.

Voici les données que je dois juger. Appelons cette table 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 

Le jugement doit avoir correspondance nIndex entre les 2 tables, NTORQUE_STATUS doit être 1 et NTORQUE_VALEU doit être comprise entre NMIN et nmax dtTorquesRequired.

Maintenant, je le fais actuellement dans mon application en utilisant uniquement les résultats du nombre de lignes SQL, mais il est lent. Je le fais par l'intermédiaire de plusieurs appels bavards au lieu d'un appel massif à la base de données, puis travailler avec les jeux de données résultants.

C'est comme ça que je le fais actuellement, mais c'est lent. Je veux faire tout le traitement localement au lieu d'utiliser 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 

Comment puis-je interroger un objet datatable localement à l'aide VB.NET sans utiliser SQL

Merci à l'avance

+1

Vous devez activer le paramètre 'Option Strict On'. Ce "SQL Helper" doit également générer de nombreuses conversions de types de données. DataTables peut être interrogé, donc à moins de nombreuses lignes, vous pouvez le faire plutôt que d'exécuter une nouvelle requête pour chaque ligne. – Plutonix

+0

Si vous utilisez SQL Server 2008 et supérieur, vous pouvez utiliser [Paramètres Table-Value] (https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/table-valued-parameters # creating-table-valued-parameter-types), que vous pouvez utiliser pour passer une table de données entière à une procédure stockée et la traiter en masse. –

Répondre

1

Vous pouvez utiliser DataView objets à "requête" 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

Ceci est intéressant. Je vous remercie. Je n'étais pas au courant du constructeur DataView et de ce qu'il pouvait faire. – robinobrien76