Получить компонент SSIS C# Script для чтения из Excel через OleDb: - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь создать пакет служб SSIS для чтения из Excel. Я нашел отличный пример здесь , который очень близок к тому, что мне нужно.

Мой вопрос здесь следующий: начиная с пустого решения, каковы минимальные минимальные шаги, необходимые для получения C# Компонент скрипта для чтения из файла .xlsx?

Вот мой код:

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

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{    
    public override void CreateNewOutputRows()
    {
        string fileName = @"E:\SFTP\RSS\Results.xlsx";    
        string cstr = "Provider.ACE.OLEDB.12.0;Data Source=" + fileName + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\"";

        using (OleDbConnection xlConn = new OleDbConnection(cstr))
        {
            xlConn.Open();
            OleDbCommand xlCmd = xlConn.CreateCommand();
            xlCmd.CommandText = "Select top 10 * from Responses";
            xlCmd.CommandType = CommandType.Text;
            using (OleDbDataReader rdr = xlCmd.ExecuteReader())
            {
                while (rdr.Read())
                {
                    for (int i = 2; i < rdr.FieldCount; i++) //loop from 3 column to last
                    {
                        Output0Buffer.AddRow();
                        Output0Buffer.Question = rdr.GetName(i);
                        Output0Buffer.Response = rdr.ToString();
                    }

                }
            }
            xlConn.Close();
        }
    }

}

У меня возникают такие вопросы и вопросы, которые у меня возникают: Нужно ли настраивать диспетчер соединений на уровне решения? В компоненте сценария или код содержит все, что мне нужно?

Какой тип данных / функцию / метод я использую, чтобы прочитать ячейку как число, дату или строку?

Вот некоторые ошибки, которые я получаю:

(2,14): error CS0234: The type or namespace name 'Data' does not exist in the namespace 'System' (are you missing an assembly reference?)
(3,14): error CS0234: The type or namespace name 'Data' does not exist in the namespace 'System' (are you missing an assembly reference?)
(4,17): error CS0234: The type or namespace name 'SqlServer' does not exist in the namespace 'Microsoft' (are you missing an assembly reference?)
(5,17): error CS0234: The type or namespace name 'SqlServer' does not exist in the namespace 'Microsoft' (are you missing an assembly reference?)
(8,27): error CS0246: The type or namespace name 'UserComponent' could not be found (are you missing a using directive or an assembly reference?)
 + additional 10 errors

Я использую: VS2019, SQL Server 2016 SP2, Office 2016.

Вот снимок экрана моего листа Excel:

Responses

Содержит ответы на опросы, предоставленные сторонним колл-центром. Есть несколько столбцов для идентификации вызова, а затем каждый заголовок столбца содержит вопрос, а данные столбца - это ответ. В настоящее время он имеет 189 столбцов и будет расти / меняться со временем. Моя идея состоит в том, чтобы выбрать первые 4 столбца, которые надежно идентифицируют каждую строку, плюс 1 дополнительный столбец для каждого вопроса и ответов, и итерировать по листу, подбирая каждый заголовок и содержимое столбца, чтобы их можно было вставить в таблицу. По мере добавления столбцов они добавляются в виде дополнительных строк. Код примера, который я вставил, показывает только 2 столбца, поскольку я старался сделать пример простым.

Это то, что я пробовал. 1. Добавьте задачу DataFlow в поток управления. ControlFlow

Добавление компонента сценария в DataFlow.

При появлении запроса выберите Источник.

Дважды щелкните и откройте редактор.

Выберите Диспетчер соединений. Нажмите Добавить

В новой строке выберите Новое подключение,

Появится новый диспетчер подключений служб SSIS.

Это то, где я застрял. Я выбираю соединение OLEDB.

Что выбрать в диспетчере соединений OLEDB?

Я пробовал Access и MS Oledb Simple Provider. И тут начинают разворачиваться вещи. Учитывая, что имя файла, путь и драйвер указаны в скрипте, какие данные мне нужны для диспетчера соединений?

Я начал играть с кодом, но я понятия не имею, работает ли то, что я сделал в апстриме или правильно. Поэтому я пытаюсь начать с самого начала. Я прошу помощи, пройдя шаги по установке, чтобы добраться до C#.

Спасибо всем за ответы.

Приветствия

Пит

1 Ответ

1 голос
/ 01 мая 2020

Нет ничего, что нужно добавлять в компонент скрипта GUI, за исключением выходных данных (не забудьте правильно указать типы данных.)

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

Вот ваш код. Я изменил только несколько вещей.

public override void CreateNewOutputRows()
    {
        //Change this to your filename you do not need a connection manager
        string fileName = @"E:\SFTP\RSS\Results.xlsx";  
        string SheetName = "Sheet1";  
        string cstr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\"";

        using (System.Data.OleDb.OleDbConnection xlConn = new System.Data.OleDb.OleDbConnection(cstr))
        {
           xlConn.Open();
           System.Data.OleDb.OleDbCommand xlCmd = xlConn.CreateCommand();
           xlCmd.CommandText = "Select * from [" + SheetName + "$]"; //I assume this is the data you want
           xlCmd.CommandType = CommandType.Text;
           using (System.Data.OleDb.OleDbDataReader rdr = xlCmd.ExecuteReader())
           {
              while (rdr.Read())
              {
                 for (int i = 4; i < rdr.FieldCount; i++) //loop from 5th column to last
                 {
                    //The first 4 columns are static and added to every row
                    Output0Buffer.AddRow();
                    Output0Buffer.UniqueID = Int32.Parse(rdr[0].ToString());
                    Output0Buffer.Year = Int32.Parse(rdr[1].ToString());
                    Output0Buffer.ReportingWave = rdr.GetString(2);
                    Output0Buffer.SubmissionDate = rdr.GetString(3);
                    Output0Buffer.Question = rdr.GetName(i);
                    Output0Buffer.Answer = rdr.GetString(i);
                 }

            }
          }
          xlConn.Close();
       }
    }

Этот код успешно импортировал файл, который выглядит следующим образом:

enter image description here

...