2016-08-31 4 views
0

Я в Powershell v4.0. У меня есть раскрывающийся список в моем пользовательском интерфейсе, который я заполняю данными из моей базы данных. Вызвать функцию, которая захватывает данные, как так:Powershell Single row datatable return to fill combobox

$ConfigDynamicContractID.ItemsSource = (GetDynamicContracts).DefaultView

На внутреннем интерфейсе это выглядит следующим образом:

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 
} 

Этот код прекрасно работает. Затем мне сказали, что приведенные выше таблицы не могут разговаривать друг с другом, поэтому я должен делать индивидуальные вызовы для каждого и фильтровать в powershell. Итак, вот мой код для этого:

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 
} 

Этот код по какой-то причине не работает при возврате одной строки. Но если я сломаю этот вызов функции на два отдельных, то он работает. Смотрите ниже:

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 
} 

Кажется, что делает два выполнения выбирает в одной функции приводит к тому, «», чтобы не делать то, что он делает, когда возвращает данные. Может кто-нибудь объяснить, почему? Спасибо заранее, и, поскольку у меня есть обходной путь, нет спешки.

+0

ArrayList.add spams на выходе с индексом добавленного предмета и AFAIK он всегда должен быть подавлен независимо от операторов 'return' с'> $ null' или '| Из-Null'. Просто говорю. – wOxxOm

+0

Функции PowerShell выводят все на конвейер, который иначе не перенаправлен. Использование ключевого слова 'Return' является избыточным и избыточным. Поэтому, когда я просматриваю метод 'Add'' ArrayList' ([здесь] (https://msdn.microsoft.com/en-us/library/system.collections.arraylist.add%28v=vs.110%29 .aspx? f = 255 & MSPPError = -2147217396)) показывает, что метод выводит индекс добавленного элемента. Если это не перенаправлено, вы получите этот вывод 'Int' в конвейер в дополнение ко всему, что вам может понадобиться. – TheMadTechnician

+0

Благодарим вас за ответы. Это довольно раздражающий аспект Powershell. Я нашел в другом потоке, что если я завершу код в своей функции с помощью $ null = @ {'do code'}, а затем в конце, когда я сделаю return (return $ a), возвращается только $ a. Это некрасиво, но, похоже, не дает никаких хлопот с помощью PowerShell. – SuperVillainPresident

ответ

0

Как @TheMadTechnician и @wOxxOm указывают, что ArrayList рассылает индексы в return и return, возвращает все, что попадает в функцию. Поэтому, когда я ожидал $ PHResults, я также получил спам ArrayList. Я мог бы использовать что-то другое, кроме ArrayList, или я также обнаружил, что если я завершу свой код функции в $null = @{ 'Code' }, а затем верну переменную, которую я хочу, все, что я получаю, это переменная. Это уродливо, но оно работает.