Получить данные из переменной полного набора результатов в задаче сценария с помощью C#

Мне нужно получить данные из моей задачи SQL в объект DataTable, используя задачу сценария для создания электронного письма. Но когда я пытаюсь заполнить данные с помощью задачи заполнения адаптера OLEDB, возникает ошибка:

OleDbDataAdapter Внутренняя ошибка: неверный метод доступа к набору строк: Ordinal = 1 Status = UNSUPPORTEDCONVERSION

Скриншот

введите здесь описание изображения

как указано выше,

public void Main()
{
    // TODO: Add your code here
    DataTable dt = new DataTable();
    String message = "";
    OleDbDataAdapter adapter = new OleDbDataAdapter();

    if (Dts.Variables.Contains("onErrorList") == true)
    {  
        try
        {
            try
            {
                adapter.Fill(dt, Dts.Variables["onErrorList"].Value);
            } catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }

            foreach (DataRow row in dt.Rows)
            {
                message = message + "\n" + "Error Time : " + row["message_time"] + "\n" + "Execution Path : " + row["executionpath"] + "\n" + "Error : " + row["MESSAGE"];
            }
        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message);
        }
    }

    message = Dts.Variables["executionMessage"].Value + "\n" + message;


    try {
        sendMail("[email protected]", "Error in  ETL ", message);
        Dts.TaskResult = (int)ScriptResults.Success;
    }
    catch (Exception e)
    {

        MessageBox.Show(e.Message, "Mail Sending Failed");
        Dts.TaskResult = (int)ScriptResults.Failure;
    }


}

#region ScriptResults declaration
/// <summary>
/// This enum provides a convenient shorthand within the scope of this class for setting the
/// result of the script.
/// 
/// This code was generated automatically.
/// </summary>
enum ScriptResults
{
    Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
    Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};
#endregion

эта строка, где была сгенерирована ошибка:

adapter.Fill(dt, Dts.Variables["onErrorList"].Value); 

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

    SELECT  message_time,CAST(execution_path AS NVARCHAR(100)) AS executionpath , MESSAGE
FROM   (
       SELECT  em.*
       FROM    SSISDB.catalog.event_messages AS em 
       WHERE   em.operation_id = (SELECT MAX(execution_id) FROM SSISDB.catalog.executions)
          -- AND event_name NOT LIKE '%Validate%'
       )q 
WHERE   event_name = 'OnError'
ORDER BY message_time DESC

Сопоставление набора результатов с переменной сопоставление с переменной объекта

тип переменной Список переменных в моем пакете

Пожалуйста помоги мне с этим.


person umair    schedule 04.03.2019    source источник
comment
Можете ли вы предоставить команду SQL, используемую в задаче SQL, и как вы сопоставили результат с переменной? если вы предоставите дополнительные скриншоты, они будут более конкретными.   -  person Yahfoufi    schedule 04.03.2019
comment
Ваша переменная SSIS должна иметь тип OBJECT, и вы не можете получить к ней доступ, используя .value, как это. Вам нужно привести/преобразовать тип переменной OBJECT SSIS в тип, который вы можете использовать в своем коде C#. В зависимости от того, что вам нужно с ним делать, будет зависеть от типа преобразования, которое вам нужно сделать.   -  person Brad    schedule 04.03.2019


Ответы (2)


Я делаю это, чтобы импортировать набор результатов из переменной SSIS в таблицу данных для последующего использования в моем коде. Вот как я это делаю.

Ваша переменная SSIS должна иметь тип данных объекта. Если нет, вам нужно использовать это в первую очередь.

Затем вы используете С#, чтобы получить данные и преобразовать их в адаптер, как показано ниже (вместо прямого преобразования в адаптер, как вы пытаетесь сделать):

// import SSIS variable of object type
Object OBJDataTableValidFieldListFull = Dts.Variables["User::SSISVariableObject"].Value;

// create datatable variable and dataadpapter
DataTable dtValidFieldListFull = new DataTable();
OleDbDataAdapter dataAdapter = new OleDbDataAdapter();

// fill datatable from variable passed from SSIS Object type
dataAdapter.Fill(dtValidFieldListFull, OBJDataTableValidFieldListFull);
person Brad    schedule 04.03.2019
comment
я попробовал это, но все равно возникла та же ошибка в той же точке. - person umair; 05.03.2019
comment
это сработало, когда я работал над этим с самого начала. Спасибо. - person umair; 05.03.2019
comment
Это странно, я пробовал подход OP, и это сработало! У вас есть какое-нибудь объяснение, почему мы должны присвоить его объектной переменной перед использованием в адаптере? я не нашел, что упоминалось при поиске этой проблемы. - person Yahfoufi; 05.03.2019
comment
Пока это тип объекта, полученный из SSIS, и он правильно передан в адаптер, он должен работать, способ, который я описал выше, упрощает чтение/просмотр того, что происходит (и если возникают какие-либо проблемы/ошибки, это легче увидеть, где/какая часть вызывает проблему), если выполнение прямого приведения может быть парой проблем с ошибкой, затрудняющей отладку - person Brad; 05.03.2019

Прежде всего убедитесь, что Dts.Variables["onErrorList"].Value содержит допустимый набор записей и относится к типу System.Object.

Кроме того, я думаю, что OledbDataAdapter имеет некоторые ограничения при чтении из SQL, поскольку поддерживаются не все типы данных, т.е. nvarchar(max)

Похожая проблема

person Hadi    schedule 04.03.2019