C# SSIS脚本任务-向多个收件人发送不同的结果

C# SSIS脚本任务-向多个收件人发送不同的结果,c#,datatable,ssis,sendmail,script-task,C#,Datatable,Ssis,Sendmail,Script Task,我正在努力将一个不同的机构发送给多个收件人 以下是我想做的: 我正在执行一个SQL查询,并在“执行SQL任务”中获得结果。 结果示例: 脚本如下所示: public void Main() { // TODO: Add your code here Variables varCollection = null; Dts.VariableDispenser.LockForWrite("User::QueryResult"

我正在努力将一个不同的机构发送给多个收件人

以下是我想做的:

我正在执行一个SQL查询,并在“执行SQL任务”中获得结果。

结果示例:

脚本如下所示:

public void Main()
    {
        // TODO: Add your code here
        Variables varCollection = null;
        Dts.VariableDispenser.LockForWrite("User::QueryResult");
        Dts.VariableDispenser.GetVariables(ref varCollection);
        string result = varCollection["User::QueryResult"].Value.ToString();
        var data = varCollection["User::QueryResult"].Value;
        

        OleDbDataAdapter da = new OleDbDataAdapter();
        DataTable dt = new DataTable();
        da.Fill(dt, varCollection["User::QueryResult"].Value);

        foreach (DataRow row in dt.Rows)
        {
            string body = string.Empty;
            string emailTo = string.Empty;
            string subject = string.Empty;
            try
            {
                List<string> final = new List<string>();
                foreach (DataRow row2 in dt.Rows)
                {
                    emailTo = row2["Email"].ToString();
                    subject = row2["SalesOrder"].ToString() + " products have been approved";
                    List<string> temp = new List<string>();
                    if (row2[2].ToString() == emailTo)
                    {
                        temp.Add(row2.ToString());
                        final.Add(string.Join("\t", temp));
                    }
                    
                    body = string.Join("\r\n", final);
                }
                SendMailMessage("ssisnotifier@admin.com", emailTo, subject, body, true, credetnials);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        Dts.TaskResult = (int)ScriptResults.Success;
    }
public void Main()
{
//TODO:在此处添加代码
变量varCollection=null;
Dts.VariableDispenser.LockForWrite(“用户::查询结果”);
variablepender.GetVariables(ref varCollection);
字符串结果=varCollection[“User::QueryResult”].Value.ToString();
var data=varCollection[“User::QueryResult”]。值;
OleDbDataAdapter da=新的OleDbDataAdapter();
DataTable dt=新的DataTable();
da.Fill(dt,varCollection[“User::QueryResult”].Value);
foreach(数据行中的数据行)
{
string body=string.Empty;
string emailTo=string.Empty;
string subject=string.Empty;
尝试
{
最终列表=新列表();
foreach(数据行中的第2行)
{
emailTo=row2[“Email”].ToString();
主题=第2行[“销售订单”]。ToString()+“产品已批准”;
列表温度=新列表();
如果(第2行[2].ToString()==emailTo)
{
临时添加(row2.ToString());
final.Add(string.Join(“\t”,temp));
}
body=string.Join(“\r\n”,final);
}
SendMailMessage(“ssisnotifier@admin.com“、电子邮件收件人、主题、正文、真实、凭据);
}
捕获(例外情况除外)
{
Show(例如ToString());
}
}
Dts.TaskResult=(int)ScriptResults.Success;
}
目前我得到的结果是完全错误的。有了这个脚本,所有的接收者都将获得整个DataTable

我正在尝试发送包含电子邮件“测试”的特定行。recepient@abc.com“发送到这封电子邮件

因此,基本上,两行将被发送到“测试”。recepient@abc.com“和仅一对一”测试2。recepient2@def.com“


如果你有任何问题,请告诉我。期待您的建议和解答!谢谢

> P>一个选项,使用<代码> DATABATE <代码>选择方法,找到匹配的电子邮件记录,以便在内部循环中处理。
public void Main()
{
    // TODO: Add your code here
    Variables varCollection = null;
    Dts.VariableDispenser.LockForWrite("User::QueryResult");
    Dts.VariableDispenser.GetVariables(ref varCollection);
    string result = varCollection["User::QueryResult"].Value.ToString();
    var data = varCollection["User::QueryResult"].Value;

    OleDbDataAdapter da = new OleDbDataAdapter();
    DataTable dt = new DataTable();
    da.Fill(dt, varCollection["User::QueryResult"].Value);

    IList<string> workedEmails = new List<string>();
    foreach (DataRow row in dt.Rows)
    {
        string body = string.Empty;
        string emailTo = row[2].ToString().Trim();
        // already worked this email on a previous row; skip it this time
        if (workedEmails.Contains(emailTo)) continue;
        // filter rows for current email and use all matched rows to build message body
        string filter = $"Email = '{emailTo}'";
        DataRow[] matchingEmailRows = dt.Select(filter);
        foreach (DataRow matchedRow in matchingEmailRows)
        {
            string salesOrder = matchedRow[0].ToString();
            string subject = salesOrder + " products have been approved";
            string matchedEmail = matchedRow["Email"].ToString();
            if (emailTo == matchedEmail)
            {
                body += subject + Environment.NewLine;
            }
        }
    SendMailMessage("ssisnotifier@admin.com", emailTo, subject, body, true, credetnials);
    workedEmails.Add(emailTo);
}
public void Main()
{
//TODO:在此处添加代码
变量varCollection=null;
Dts.VariableDispenser.LockForWrite(“用户::查询结果”);
variablepender.GetVariables(ref varCollection);
字符串结果=varCollection[“User::QueryResult”].Value.ToString();
var data=varCollection[“User::QueryResult”]。值;
OleDbDataAdapter da=新的OleDbDataAdapter();
DataTable dt=新的DataTable();
da.Fill(dt,varCollection[“User::QueryResult”].Value);
IList workedEmails=新列表();
foreach(数据行中的数据行)
{
string body=string.Empty;
字符串emailTo=行[2]。ToString().Trim();
//已在前一行处理此电子邮件;这次跳过它
如果(workedEmails.Contains(emailTo))继续;
//筛选当前电子邮件的行,并使用所有匹配的行来构建邮件正文
字符串筛选器=$“电子邮件='{emailTo}'”;
DataRow[]matchingEmailRows=dt.Select(过滤器);
foreach(匹配EmailRows中的DataRow matchedRow)
{
字符串salesOrder=matchedRow[0]。ToString();
字符串主题=salesOrder+“产品已批准”;
字符串matchedEmail=matchedRow[“Email”].ToString();
如果(emailTo==matchedEmail)
{
body+=主题+环境.NewLine;
}
}
SendMailMessage(“ssisnotifier@admin.com“、电子邮件收件人、主题、正文、真实、凭据);
workedEmails.Add(emailTo);
}

非常感谢@quaabaam,这就成功了!