2016-08-31 2 views
0

Ich bin in Powershell v4.0. Ich habe ein Dropdown-Menü auf meiner Benutzeroberfläche, das ich mit Daten aus meiner Datenbank bearbeite. Ich nenne eine Funktion, die Daten wie so packt:Powershell Einreihige Datentabelle zurück zu füllen Combobox

$ConfigDynamicContractID.ItemsSource = (GetDynamicContracts).DefaultView

Auf dem Backend es wie folgt aussieht:

function GetDynamicContracts{ 
    $ContractQuery = "select con.ContractNumber as Name, c.ContractID from foo..campaign c inner join foo..campaigntemplate ct on c.campaignid = ct.campaignid 
inner join foo..template t on ct.templateid = t.templateid inner join bar..contracts con on con.ContractID = c.ContractID 
    where c.ProductType = 'INTRO' and t.FileName = 'Intro Dynamic Template' and c.DeleteFlag = 0" 

    $ContractResult = ExecuteSelect "Bar" $ContractQuery 
    return , $ContractResult 
} 

Dieser Code funktioniert gut. Mir wurde dann gesagt, dass die Tabellen, auf die oben verwiesen wird, nicht miteinander sprechen können, so dass ich individuelle Anrufe an jedes einzelne tun muss und in Powershell filtern muss. Also hier ist mein Code dafür:

function GetDynamicContracts{ 

    $CampaignQuery = "Select c.* From foo..Campaign c join foo..CampaignTemplate ct on c.CampaignID = ct.CampaignID 
        join foo..Template t on ct.TemplateID = t.TemplateID 
        Where c.ProductType = 'INTRO' and t.FileName = 'Intro Dynamic Template' and c.DeleteFlag = 0" 
    $CampaignResults = ExecuteSelect "foo" $CampaignQuery 

    $ContractIDs = New-Object System.Collections.ArrayList 

    foreach($row in $CampaignResults.Rows){ 
     $ContractIDs.Add($row.ContractID) 
    } 
    $ContractIDs = $ContractIDs -join "," 

    $PHQuery = "Select ContractID, ContractNumber as Name From Contracts Where ContractID in ($ContractIDs)" 
    $PHResults = ExecuteSelect "Bar" $PHQuery 

    #Log $MyInvocation.MyCommand $PSBoundParameters 
    return ,$PHResults 
} 

Dieser Code aus irgendeinem Grund funktioniert nicht, wenn Sie eine einzelne Zeile zurückgeben. Aber wenn ich diesen Funktionsaufruf in zwei getrennte teile, dann klappt es. Siehe unten:

function GetDynamicContracts{ 

    $ContractIDs = GetDynamicCampaign 
    $ContractIDs = $ContractIDs[1] 

    $PHQuery = "Select ContractID, ContractNumber as Name From Contracts Where ContractID in ($ContractIDs)" 
    $PHResults = ExecuteSelect "PhytelMaster" $PHQuery 

    Log $MyInvocation.MyCommand $PSBoundParameters 
    return ,$PHResults 
} 

function GetDynamicCampaign{ 

    $CampaignQuery = "Select c.* From Campaign..Campaign c join Campaign..CampaignTemplate ct on c.CampaignID = ct.CampaignID 
        join Campaign..Template t on ct.TemplateID = t.TemplateID 
        Where c.ProductType = 'INTRO' and t.FileName = 'Intro Dynamic Template' and c.DeleteFlag = 0" 
    $CampaignResults = ExecuteSelect "Campaign" $CampaignQuery 

    $ContractIDs = New-Object System.Collections.ArrayList 
    foreach($row in $CampaignResults.Rows){ 
     $ContractIDs.Add($row.ContractID) 
    } 
    $ContractIDs = $ContractIDs -join "," 

    return $ContractIDs 
} 

Es scheint, dass zwei wählt in einer einzigen Funktion ausführen zu machen bewirkt, dass die ‚‘ zum Scheitern verurteilt zu tun, was er tut, wenn die Daten zurück. Kann mir jemand erklären warum? Vielen Dank im Voraus und da ich einen Workaround habe, gibt es keine Eile.

+0

ArrayList.add Spams in der Ausgabe mit dem hinzugefügten Item-Index, und AFAIK sollte immer unterdrückt werden, unabhängig von 'return' Anweisungen mit'> $ null' oder '| Out-Null'. Sag es einfach. – wOxxOm

+0

PowerShell-Funktionen geben alles an die Pipeline aus, die sonst nicht umgeleitet wird. Das Schlüsselwort 'Return' ist redundant und überflüssig. Wenn ich also die 'Add'-Methode einer' ArrayList' suche ([hier] (https://msdn.microsoft.com/en-us/library/system.collections.arraylist.add%28v=vs.110%29 .aspx? f = 255 & MSPPError = -2147217396)) zeigt, dass die Methode den Index des hinzugefügten Elements ausgibt. Wenn das nicht umgeleitet wird, erhalten Sie diese 'Int'-Ausgabe zusätzlich zu allem, was Sie sonst noch brauchen, in die Pipeline. – TheMadTechnician

+0

Vielen Dank für Ihre Antworten. Dies ist ein eher ärgerlicher Aspekt von Powershell. Ich fand in einem anderen Thread, dass, wenn ich den Code in meiner Funktion mit $ null = @ {'do code}} und dann am Ende, wenn ich die Rückgabe (return $ a) wickeln, dann nur $ a zurückgibt. Es ist hässlich, aber scheint keine Hanky ​​Panky mit Powershell zu garantieren. – SuperVillainPresident

Antwort

0

Wie @TheMadTechnician und @wOxxOm darauf hinweisen ArrayList Spams die Indizes in die Rückkehr und zurück, gibt alles zurück, was Spam in der Funktion wird. Als ich also $ PHResults erwartete, bekam ich auch den ArrayList-Spam. Ich könnte etwas anderes als die ArrayList verwenden, oder ich fand auch, dass, wenn ich meinen Funktionscode in wische und dann die Variable zurückgebe, die ich will, bekomme ich nur diese Variable. Es ist hässlich, aber es funktioniert.

Verwandte Themen