0

したがって、データベースに対して (2 回) クエリを実行し、結果をデータセットに返す関数があります。結果をチェックして (いくつかあることを確認します)、ループして、返されたデータセットから各行を取得し、別のデータセットにインポート (コピー) します。

また、リストに主キーを追加して、同じ項目を (2 番目のクエリから) データセットに 2 回追加しないようにします。

次に、データセットを返します。

問題?クエリは機能し、戻り値があります..しかし、行をインポートしようとしているデータセットは、インポートされた行を保持しません。

私のアプローチと当面の問題について何か提案をしてください。私は常に改善を目指しています!

Public Function GetClientsWithMonitors(ByVal argHost As FOO.Interfaces.BAR) As DataSet
    Try
        Dim localDataSet As New DataSet()
        Dim clientsWithMonitors As New DataSet()
        Dim tempList As New List(Of Integer)

        clientsWithMonitors.Clear()
        localDataSet.Clear()
        tempList.Clear()
        clientsWithMonitors.Tables.Add()

        'SQL getting monitors applied to clients
        Dim clientSQL As String = "SELECT DISTINCT c.ClientID, c.Name FROM agents a LEFT JOIN clients c ON c.ClientID = a.ClientID WHERE a.ClientID > 0"
        'SQL getting monitors applied directly to an agent
        Dim agentSQL As String = "SELECT DISTINCT c.ClientID, c.Name FROM clients c LEFT JOIN computers comp ON c.ClientID = comp.ClientID LEFT JOIN agents a ON comp.ComputerID = a.ComputerID  WHERE a.LocID = 0 AND a.ClientID = 0 AND a.ComputerID > 0"
        localDataSet = argHost.GetDataSet(clientSQL)
        If localDataSet.Tables.Count > 0 AndAlso localDataSet.Tables(0).Rows.Count > 0 Then
            For Each row As DataRow In localDataSet.Tables(0).Rows
                If Not tempList.Contains(CInt(row("ClientID").ToString())) Then
                    Dim clientID As Integer = CInt(row("ClientID").ToString())
                    clientsWithMonitors.Tables(0).ImportRow(row)
                    tempList.Add(clientID)
                End If
            Next
        End If
        If localDataSet.Tables.Count > 0 AndAlso localDataSet.Tables(0).Rows.Count > 0 Then
            localDataSet.Clear()
            localDataSet = argHost.GetDataSet(agentSQL)
            For Each row As DataRow In localDataSet.Tables(0).Rows
                If Not tempList.Contains(CInt(row("ClientID").ToString())) Then
                    Dim clientID As Integer = CInt(row("ClientID").ToString())
                    clientsWithMonitors.Tables(0).ImportRow(row)
                    tempList.Add(clientID)
                End If
            Next
        End If
        Return clientsWithMonitors
    Catch ex As Exception
        LogEventViaHost(argHost, "Error Getting dataset of clients with a specified monitor" & ex.StackTrace & " " & ex.Message)
        Return Nothing
    End Try
4

1 に答える 1

0

列名は明示的に指定する必要があります。何らかの理由で、インポートされたデータ行の行から列名を暗黙的に継承するデータセットを考えていました。

clientsWithMonitors.Tables(0).Columns.Add("Foo")
clientsWithMonitors.Tables(0).Columns.Add("Bar")
于 2012-05-10T13:14:08.273 に答える