Компонент сценария веб-службы SSIS (данный ключ отсутствовал в словаре)

Прошу прощения, если на этот вопрос уже был дан ответ, но я провел некоторое исследование и еще не нашел что-то, что имеет смысл.

Я создаю компонент сценария SSIS, который подключается к веб-службе и должен выгружать данные в таблицу SQL. Хотя работа над компонентом сценария все еще продолжается, в настоящее время я получаю следующую ошибку: в System.Collections.Generic.Dictionary`2.get_Item (ключ TKey) в ScriptMain.CreateNewOutputRows () в UserComponent.PrimeOutput (выходы Int32, Int32 [] OutputIDs, PipelineBuffer [] Buffers, OutputNameMap OutputMap) в Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.PrimeOutput (выходы Int32, Int32 [] outputID, буферы PipelineBuffer [])

Вот ядро ​​кода, который я использую для компонента сценария:

  public Dictionary<string, int> agentStatisticsColumns = new Dictionary<string, int>();

public override void CreateNewOutputRows()
{

    //setSessionParameters sessionParams = new setSessionParameters();
    //sessionParams.viewSettings = new viewSettings
    //{
    //    appType = "Custom",
    //    forceLogoutSession = false,
    //    idleTimeOut = 600,
    //    rollingPeriod = rollingPeriod.Minutes5,
    //    shiftStart = 28800000,
    //    statisticsRange = statisticsRange.CurrentDay,
    //    timeZone = -25200000
    //};


        getStatistics statistics = new getStatistics();

        statistics.statisticTypeSpecified = true;
        statistics.statisticType = statisticType.AgentStatistics;
        statistics.columnNames = null;

        getStatisticsResponse resp = new getStatisticsResponse();

        statistics statistics_return = resp.@return;

        int usernameIdx = agentStatisticsColumns["Username"];

        foreach (row r in statistics_return.rows)
        {
            Output0Buffer.Username = r.values[usernameIdx];
            //string log = r.values[usernameIdx];

            //Output0Buffer.Username = log;
        }

}

Любая помощь будет принята с благодарностью!


person darksideguy    schedule 15.08.2017    source источник
comment
Лично я думаю, что если вы просто загружаете данные веб-службы в таблицу, будет намного проще, если вы просто создадите консольное приложение для этого. В задаче сценариев SSIS отсутствует множество полезных инструментов отладки, и при развертывании есть некоторые ошибки (они могут быть исправлены, но в прошлый раз, когда я использовал его, вам потребуются специальные права администратора на временный диск на диске C на развернутом сервере). В любом случае .. вы можете сказать, на какой строке происходит ошибка?   -  person Nick.McDermaid    schedule 15.08.2017
comment
Спасибо за ваш ответ. Похоже, что ошибка возникает в int usernameIdx = agentStatisticsColumns [Username]; линия. Я думал о том, чтобы не использовать SSIS, но я исхожу из неудачной попытки установить эту веб-службу через Power BI. Конечная цель - создать визуал в Power BI с данными, экспортированными в SQL Server. Поэтому я выбираю SSIS, но если я не могу решить эту проблему, мне, возможно, придется искать план C.   -  person darksideguy    schedule 15.08.2017
comment
Использование power bi - наименее практичный и ремонтопригодный способ. SSIS - лучший подход, но задача скрипта страдает от недостатка удобства использования. Консольное приложение C # - это наиболее надежный подход, но вы должны уметь использовать его при сборке системы. В любом случае ... ваша ошибка говорит, что не может найти имя пользователя в массиве agentStatisticsColumns. Что неудивительно, поскольку я не вижу, чтобы он загружался в ваш код. Означает ли это представление данных, поступающих от веб-службы?   -  person Nick.McDermaid    schedule 15.08.2017
comment
Да, имя пользователя - это поле метода getstatistics веб-сервиса.   -  person darksideguy    schedule 15.08.2017
comment
В этом коде переменная agentStatisticsColumns ничего не содержит. В него нет кода, который ничего загружает. Вам нужен код, который использует getStatisticsResponse (в котором что-то есть), чтобы каким-то образом заполнить agentStatisticsColumns. Было бы полезно, если бы вы могли проверять содержимое getStatisticsResponse во время выполнения. Не уверен, что вы можете сделать это в редакторе сценариев SSIS.   -  person Nick.McDermaid    schedule 15.08.2017


Ответы (1)


Вы абсолютно правы, и это глупая оплошность с моей стороны. Мне нужно включить поле: public static WsSupervisorService supervisorService = null;

Этим я могу обернуть getStatisticsResponse resp = supervisorService.getStatistics (statistics); с фактическим значением VALUE.

Спасибо, Ник!

 public Dictionary<string, int> agentStatisticsColumns = new Dictionary<string, int>();
    public static WsSupervisorService supervisorService = null;
    public static void Main(string[] args)
    {
        supervisorService = new WsSupervisorService();
        setSessionParameters sessionParams = new setSessionParameters();

        sessionParams.viewSettings = new viewSettings
        {
            appType = "Custom",
            forceLogoutSession = false,
            idleTimeOut = 600,
            rollingPeriod = rollingPeriod.Minutes5,
            shiftStart = 28800000,
            statisticsRange = statisticsRange.CurrentDay,
            timeZone = -25200000
        };

        getStatistics statistics = new getStatistics();
        statistics.statisticTypeSpecified = true;
        statistics.statisticType = statisticType.AgentStatistics;
        statistics.columnNames = null;

        try
        {
            getStatisticsResponse resp = supervisorService.getStatistics(statistics);
        }
        catch (Exception)
        {

            throw;
        }
    }
person darksideguy    schedule 15.08.2017
comment
Спасибо, что вернулись с решением. Было бы очень удобно, если бы вы могли разместить здесь свой окончательный код. Тогда я уверен, что можно принять свой ответ - person Nick.McDermaid; 15.08.2017