Преобразуйте DTS.Variables типа System.Object в список - PullRequest
3 голосов
/ 28 мая 2019

У меня есть пакет служб SSIS, который выполняет задачу SQL для получения имен серверов, к которым мне нужно подключиться.Затем результаты этого запроса сохраняются в переменном объекте, называемом «серверы».Затем я хочу запустить еще один пакет на каждом сервере одновременно, поэтому я хотел выделить переменную «серверы».Тем не менее, когда я делаю это в задаче сценария C #, я получаю сообщение об ошибке:

Ошибка: 0x1 в задаче сценария: исключение было вызвано целью вызова.

Воткод для разделения серверной переменной:

Ошибка: 0x1 при выполнении задачи сценария: целевым объектом вызова выдано исключение.

public void Main()
{
    var serverlist = (string[])Dts.Variables["User::servers"].Value;

    Dts.Variables["server1"].Value = serverlist[0];
    Dts.TaskResult = (int)ScriptResults.Success;
}

Должно бытьдовольно простой код, но по какой-то причине он просто не работает.

Ответы [ 3 ]

1 голос
/ 28 мая 2019

Так как вы упомянули, что:

У меня есть пакет служб SSIS, который выполняет задачу SQL для получения имен серверов

Основная проблема заключается в следующей строке:

var serverlist = (string[])Dts.Variables["User::servers"].Value;

Задача «Выполнение SQL» не возвращает список строк, она возвращает объект набора записей. Чтобы прочитать его в рамках задачи скрипта, вы должны следовать следующему посту (Вы должны использовать OledbAdapter) :

0 голосов
/ 30 мая 2019

Судя по названию вашего вопроса, вы пытаетесь заполнить список C # из переменной объекта SSIS.Если это правильно, это можно сделать следующим образом.Либо вы можете заполнить объект DataTable содержимым переменной объекта SSIS, либо, если вы хотите использовать конкретный список, список можно заполнить из DataTable, и после этого вы сможете работать со списком.В приведенном ниже примере OleDBDataAdapter используется для заполнения объекта DataTable из переменной объекта SSIS с использованием метода Fill.Данные, заполненные из переменной объекта, могут быть доступны через DataRow объекты в DataTable.Поскольку, похоже, переменная объекта SSIS содержит только один столбец, к нему можно получить доступ из индекса 0 столбца каждого DataRow, dr[0] ниже.Скорее всего, вы уже сделали это, но убедитесь, что переменная объекта SSIS находится в поле ReadOnlyVariables Задачи сценария.

using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;


List<string> serverNamesList = new List<string>();

OleDbDataAdapter dtAdapter = new OleDbDataAdapter();
DataTable serverNamesDataTable = new DataTable();

//populate data table
dtAdapter.Fill(serverNamesDataTable, Dts.Variables["User::ObjectVariable"].Value);

foreach (DataRow dr in serverNamesDataTable.Rows)
{
    //either access server names from column index 0 of DataRow or add to list
    serverNamesList.Add(dr[0].ToString()); 
}
0 голосов
/ 28 мая 2019
  1. Создайте новую переменную пакета и назовите ее ConnectionStringOle
  2. Добавьте цикл ForEach
  3. Тип: Перечислитель Foreach ADO
  4. Исходная переменная объекта ADO: Выберите ObjectR.
  5. Режим перечисления: Строки во всех таблицах (только набор данных ADO.NET)
  6. В переменнойОтображения, сопоставьте результат с новой переменной пакета, начиная с шага 1
  7. Измените диспетчер соединений сервера SQL, чтобы установить для свойства ConnectionString значение ConnectionStringOle.

Оттуда,делайте все, что вам нужно сделать для каждой итерации цикла.

Примечание: если вы просто извлекаете имя экземпляра сервера, то вы должны создать еще одну переменную пакета, которая анализирует имя экземпляра во всем значении ConnectionString.Вы можете получить это, скопировав существующее значение ConnectionString в выражение переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...