Скрипт Преобразование компонента значение строки в переменную - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть компонент преобразования скрипта, который получает данные из источника OLEDB и для каждой строки выполняет хранимую процедуру с параметрами, основанными на значении строки. Я использовал эту функциональность в прошлых решениях без проблем, однако теперь она выбрасывает страшное «Ссылка на объект не установлена ​​на экземпляр объекта». Я сравнил все настройки (например, версию фреймворка, ввод / вывод, ссылки на сборки и т. Д.), Которые я могу сравнить между двумя решениями, но безрезультатно. Кажется, есть только проблема с фактической установкой переменных, то есть я могу создать открытый счетчик, вывести сообщение со счетчиком (в методе ProcessInputRow) и увеличить счетчик - это вызовет столько сообщений, сколько строк в исходная таблица. Я также попытался .ToString () для значений переменных без какой-либо удачи.

Ошибка выполнения enter image description here

Задача потока данных

enter image description here

Входные столбцы enter image description here

Менеджеры соединений enter image description here Сценарий

using System;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;


[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
    SqlConnection conn = new SqlConnection();
    IDTSConnectionManager100 connMgr;

    public override void AcquireConnections(object Transaction)
    {
        connMgr = base.Connections.adoAdminsys;
        conn = (SqlConnection)connMgr.AcquireConnection(null);
    }

    public override void PreExecute()
    {
        //base.PreExecute();
    }

    public override void PostExecute()
    {
        //base.PostExecute();
    }

    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        string certNbr = Row.certNbr;
        int seqNbr = Row.seqNbr;

        try
        {
            SqlCommand cmd = new SqlCommand("dbo.jbb_test_insert", conn);

            cmd.Parameters.Add(new SqlParameter("@certNbr", certNbr));
            cmd.Parameters.Add(new SqlParameter("@seqNbr", seqNbr));

            cmd.ExecuteNonQuery();

        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message);
        }
    }
}

Опять же, если я сделаю что-то, чтобы отобразить сообщение в буфере строк, оно сгенерирует точное количество раз, когда есть строки в источнике. Я также включил средство просмотра данных между источником и компонентом сценария, чтобы гарантировать, что строки действительно передаются. Кроме того, если я просто попытаюсь отобразить переменные (certNbr, seqNbr) в сообщении, я получу сообщение об ошибке - поэтому я убежден, что проблема связана со строками ввода.

...