通过正文发送邮件任务从 SQL 服务器 table 发送所有记录

Send all records from SQL Server table though send mail task in body

我正在尝试通过发送邮件任务发送电子邮件正文中的所有 table 记录

我的流量:

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

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

  3. 我使用发送邮件任务来发送邮件

我只得到邮件正文中 table 的最后记录。

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

Actaul flow

error

我想我会采取稍微不同的方法,直接在脚本任务中递归记录集,但这看起来也可行。我猜你的问题是你在每次迭代时 overwrite User::EmailMessage 。你说你得到了最后几条记录但是看看你的代码我认为你会得到 1 除非你取消注释 IF (varcollection == string.empty) 在这种情况下你可能会得到更多。

总之,主要的问题是

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

这会在任何时候调用时将您的 EmailMessage body 重置为 header 行。

编辑:根据您的评论添加以在每个新货件号处重置消息。添加另一个包变量 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);
    }