Member 13093390 Ответов: 1

Цикл через базу данных в преобразовании скрипта SSIS


Я пытаюсь использовать задачу сценария SSIS для передачи значений из таблицы в текстовый файл. Текстовый файл будет использоваться для печати чеков, поэтому он отформатирован как таковой. У меня есть временная таблица проверки, которая поступает в компонент преобразования сценария. Пакет завершается успешно, но в текстовый файл сохраняется только последняя строка из базы данных. Я исследовал, как перебирать каждую строку, и, похоже, все больше запутался. Я не уверен, нужно ли мне настраивать ввод / вывод в пакете или создавать переменные для вызова в сценарии. Я новичок в C #, так что это тоже не помогает. Будем очень признательны за любые советы / рекомендации. Ниже приведен код, который у меня есть в настоящее время для достижения необходимого формата. Мне нужно перебрать базу данных и применить форматирование для каждой печатаемой строки / чека.

public override void Input0_ProcessInputRow(Input0Buffer Row)
    {

        StreamWriter sw = new StreamWriter("c:\\test.txt");
        sw.WriteLine("XXXXXXXXXXXX" + "XXXX".PadLeft(52) + Row.CheckID
            + "\r" + "\nXXXXXXXXXXXXXX" + "XXXXXX\r".PadLeft(27)
            + "\nP. O. BOX XXXX" + "24 HOUR BANKING".PadLeft(36)
            + "XX-XXXX".PadLeft(27) + "\r"
            + "\nXXXXXXXX, XX  XXXXX" + ",".PadLeft(17) + "-------\r".PadLeft(42)
            + "\n    " + "XXXX\r".PadLeft(71)
            + "\n    ".PadRight(50) + Row.FName + " " + Row.LName + " ".PadLeft(19) + DateTime.Now.ToString("MMM dd yyyy").ToUpper()
            + "\r" + "\n "
            + "\r" + "\n " + " \r"
            + "\n ".PadRight(8) +"**XXX DOLLARS AND 00/100**" +" ".PadLeft(37)+Row.Amount
            + "\r" + "\n "
            + "\r" + "\n " + " \r"
            + "\n ".PadRight(11)+Row.VendorName1
            + "\r" + "\n ".PadRight(11)+Row.VendorName2
            + "\r" + "\n ".PadRight(11)+Row.VendorName3
            + "\r" + "\n ".PadRight(11)+Row.VendorAddress1
            + "\r" + "\n ".PadRight(11)+Row.VendorAddress2
            + "\r" + "\n ".PadRight(11)+Row.VendorCity+","+ " "+Row.VendorState+" ".PadLeft(4)+" "+Row.VendorZip
            + "\r" + "\n " + " \r"
            + "\n ".PadRight(11)+"XXXX"+Row.CheckID + "    "+"XXXXXX"+"     "+"XXXXXXXXXX"
            + "\r" + "\n " + " \r"
            + "\r" + "\n " + " \r"
            + "\r"
            + "\n " +"XXXX-".PadLeft(71) + Row.CheckID
            + "\r" + "\n " + " \r"
            + "\r"
            + "\n" + DateTime.Now.ToString("MM/dd/yyyy") + " ".PadLeft(2) + Row.ClientID + " ".PadLeft(3) + " ".PadLeft(3) + Row.FName + " " 
                   + Row.LName + " ".PadLeft(9) + Row.TCDesc1  + " ".PadLeft(29) + Row.Amount
            + "\r" + "\n "
            + " ".PadLeft(39) + "TCDesc2" + Row.TCDesc2
            + "\r" + "\n "
            + " ".PadLeft(39) + "TCDesc3" + Row.TCDesc3
            + "\r" + "\n " + " \r"
            + "\r" + "\n " + " \r"
            + "\r" + "\n " + " \r"
            + "\r" + "\n " + " \r"
            + "\r" + "\n " + " \r"
            + "\r" + "\n " + " \r"
            + "\r" + "\n " + " \r"
            + "\r" + "\n " + " \r"
            + "\r"
            + "\r"
            + "\r"
            + "\r"
            + "\r"
            + "\n" + " ".PadLeft(81) +  Row.ClientID + " ".PadLeft(9) + Row.FName + " " + Row.LName; 

             sw.Close();

        
    }


Что я уже пробовал:

Я попытался использовать задачу Execute SQL и контейнер foreach Loop, но он продолжал ошибаться. Не могу вспомнить конкретную ошибку.

Dave Kreskowiak

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

1 Ответов

Рейтинг:
12

CHill60

Причина, по которой в файл записывается только последняя строка из базы данных, заключается в том, что вы воссоздаете файл каждый раз, когда вызываете этот вызов Input0_ProcessInputRow метод. Вам нужно создать и закрыть файл снаружи из петли

Вместо этого сделайте что-нибудь вроде этого:

public void Input0_ProcessFile()
  {
      //
      // Put in here whatever you do to get datainput from the database
      //

      //Create the file once!
      using (var sw = new StreamWriter("c:\\temp\\test.txt"))
      {
          //Process each row in the datainput
          foreach (var row in datainput)
              Input0_ProcessInputRow(sw, row);
      }
  }
Обратите внимание, что я также поместил файл в подпапку. Хранить файлы в корневой папке C:\ - плохая практика, и во многих случаях вам это будет запрещено, особенно если этот скрипт запущен на сервере. Это может быть ошибка, с которой вы столкнулись.

Также обратите внимание, что я изменил сигнатуру вашего метода, чтобы передать ссылку на StreamWriter
public override void Input0_ProcessInputRow(StreamWriter sw, Input0Buffer Row)
{
...
Вот ссылка на MSDN (в боковой панели есть еще ссылки на страницу в ссылке). Как: записать текст в файл[^]

[Править] кроме того, рассмотреть вопрос об использовании System.Environment.NewLine вместо всех этих escape-символов.
Другой альтернативой было бы преобразовать данные в XML-файл и использовать HTML-шаблон/XSLT для преобразования данных в "отчет" - см. Создание и заполнение HTML-шаблона (Windows CE .NET 4.2)[^]