Отправить все записи из таблицы SQL Server, хотя отправлять почтовое задание

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

Мой поток:

  1. Я использую задачу выполнения SQL для извлечения строк из таблицы и сохранения в объекте

  2. Используется для каждого контейнера цикла, и в этом я использую задачу скрипта для хранения строк в теле EmailMessage

  3. Я использовал задачу Отправить почту, чтобы отправить письмо

Я получаю только последние записи таблицы в теле сообщения.

Подскажите пожалуйста, как отправить все данные таблицы сразу в теле сообщения

Actaul flow

ошибка

1 ответ

Решение

Я думаю, что я бы использовал немного другой подход и использовал бы набор записей непосредственно в задаче сценария, но похоже, что это тоже сработает. Я думаю, что ваша проблема в том, что вы перезаписываете User::EmailMessage на каждой итерации. Вы говорите, что получаете последние несколько записей, но, глядя на ваш код, я думаю, вы получите 1, если вы не раскомментируете IF (varcollection == string.empty) в этом случае вы можете получить больше.

В любом случае, главная проблема

varCollection["User::EmailMessage"].Value = header;

Это сбрасывает ваше тело EmailMessage в строку заголовка при каждом вызове.

Изменить: добавление в соответствии с вашим комментарием для сброса сообщения при каждом новом номере отгрузки. Добавьте другую переменную пакета PrevShippingNum, которая будет содержать предыдущее зацикленное число, чтобы проверить, является ли оно тем же самым или изменилось. Убедитесь, что эта переменная указана как ReadWriteVariable для задачи скрипта. затем измените ваш скрипт, чтобы включить что-то вроде этого:

        Dts.VariableDispenser.GetVariables(ref varCollection);

        bool newMessage = (varCollection["User::PrevShippingNum"].value != varCollection["User::ShppingNum"].value) ? true : false;

        if (string.IsNullOrWhiteSpace(varCollection["User::EmailMessage"].Value.ToString()) || newMessage)
        {
            varCollection["User::EmailMessage"].Value = string.Format("{0}........");
        }

        varCollection["User::EmailMessage"].Value += string.Format("{0}......");

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

Другой подход:

Обратите внимание, довольно большое изменение, чтобы добавить новый саб, чтобы заботиться об отправке электронных писем по ShippingNum:

Пройдя дальше, я передам переменную набора записей, которую вы используете, задаче скрипта и позволю ей создавать сообщения электронной почты. Просто чтобы быть ясно, это заменить цикл foreach! вот код, адаптированный из одного из моих решений:

Добавить ссылку на System.Data.DataSetExtensions

Добавьте следующие пространства имен:

using System.Data.OleDb;
using System.Net.Mail;
using System.Linq;
using System.Collections.Generic;

    private void Main()
    {
        //using System.Data.OleDb;
        OleDbDataAdapter oleAdapter = new OleDbDataAdapter();
        DataTable dt = new DataTable();
        oleAdapter.Fill(dt, Dts.Variables["User::OleDbRecordSetVar"].Value);

        //build header row
        string headerRow = string.Format("{0}........", "ShippingNum ....");

        //get distinct shippingNums
        var shippingNums = (from DataRow dr in dt.Rows
                            select (int)dr["ShppingNum"]).Distinct();

        //Now Build the Differnt Emails
        foreach (var num in shippingNums)
        {
            string emailBody = headerRow;
            List<DataRow> emailLines = (from DataRow dr in dt.Rows
                              where (int)dr["ShippingNum"] == num
                              select dr).ToList<DataRow>();

            foreach (DataRow line in emailLines)
            {
                emailBody += string.Format("{0}....", line["ColumnName1"].ToString(), line["ColumnName2"].ToString());
            }

            SendEmail(emailBody);

        }

        Dts.TaskResult = (int)ScriptResults.Success;
    }

    private void SendEmail(string messageBody)
    { 
        //get the smtp server address from the SSIS connection manger
        ConnectionManager smtpConnectionManager = Dts.Connections["Name Of SMTP Connection Manager"];
        //note this is for trusted authentication if you want to use a username and password you will have to do some discovery
        SmtpClient emailClient = new SmtpClient(smtpConnectionManager.Properties["SmtpServer"].GetValue(smtpConnectionManager).ToString());

        MailMessage email = new MailMessage();
        email.Priority = MailPriority.Normal;
        email.IsBodyHtml = false; //change to true if you send html
                                  //can hard code addresses if you desire I use variables to make it more flexible
        email.From = new MailAddress(Dts.Variables["User::FromAddress"].Value.ToString());
        email.To.Add(Dts.Variables["User::ToAddress"].Value.ToString());
        email.Body = messageBody;
        emailClient.Send(email);
    }
Другие вопросы по тегам