Источник данных задачи сценария SSIS 2012 C# - нет данных для строк

У меня возникла проблема при попытке использовать задачу сценария aC# в качестве источника данных для задачи потока данных в SSIS 2012. У меня гораздо больший запрос, который я собираюсь выполнить, но сейчас я просто хотел доказать, что это работать, но пока не получится. Ниже приведен код, который возвращает только одно поле, однако, как только он попадает в строку, которая называется last name = reader.getstring(), он выдает исключение, сообщающее, что данные для строки / столбца недоступны. Я точно знаю, что запрос возвращает 10 строк, но я не уверен, что происходит. Я написал код по этой ссылке: https://msdn.microsoft.com/en-us/library/ms136060.aspx

Любой совет?

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
using System.Data.OleDb;


[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{

OleDbDataReader reader;
OleDbConnection myConnection;
OleDbCommand myCommand;

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


    string sConnectionString = "Provider=MSDAORA.1;User ID = USER;Password=PASS;Data Source=SERVER;persist security info = false";
  //  string oracleQuery = Variables.OracleSQL;

    string oracleQuery = "select Name from Name_Table where rownum < 10";

    myConnection = new OleDbConnection(sConnectionString);
    myCommand = new OleDbCommand(oracleQuery, myConnection);

    myConnection.Open();

    reader = myCommand.ExecuteReader();

}

/// <summary>
/// This method is called after all the rows have passed through this component.
///
/// You can delete this method if you don't need to do anything here.
/// </summary>
public override void PostExecute()
{
    base.PostExecute();

    reader.Close();
    /*
     * Add your code here
     */
}

public override void CreateNewOutputRows()
{
   Output0Buffer.AddRow();
   Output0Buffer.Name = reader.GetString(0);

}

}

1 ответ

Из MSDN:

Положение OleDbDataReader по умолчанию перед первой записью. Поэтому вы должны вызвать Read, чтобы начать доступ к любым данным.

Вам также необходимо вызвать метод Read при переходе к следующей строке. Поэтому попробуйте следующее в вашем скрипте:

public override void CreateNewOutputRows()
{
   while (reader.Read())
   {
      Output0Buffer.AddRow();
      Output0Buffer.Name = reader.GetString(0);
   }
}

Фактически, этот подход используется на странице, на которую вы ссылаетесь.

Другие вопросы по тегам