通过在正文中发送邮件任务从SQL Server表发送所有记录

时间:2016-08-08 17:12:23

标签: sql-server ssis ssis-2012 ssis-2008

我正在尝试通过发送邮件任务

发送电子邮件正文中的所有表记录

我的流程:

  1. 我使用SQL执行任务从表中获取行并存储在对象中

  2. 用于每个循环容器,并使用脚本任务将行存储在EmailMessage正文中

  3. 我使用发送邮件任务发送电子邮件

  4. 我只获取邮件正文中表格的最后记录。

    请指导我如何在邮件正文中一次发送所有表格数据

    Actaul flow

    error

1 个答案:

答案 0 :(得分:0)

我想我会采用稍微不同的方法并直接在脚本任务中递归记录集,但这看起来也会起作用。我猜你的问题是你在每次迭代时覆盖 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);
    }