在将附件变量添加到邮件之前,如何检查附件变量是否为空?

时间:2013-02-12 18:35:52

标签: vb.net ssis

我已经设法使用带有VB.NET代码的脚本任务从我的SSIS包发送电子邮件。我不擅长编写脚本,我基本上在网上看了各种脚本,让我到达我的位置。我遇到的问题是我在BIDS中的SSIS包中设置了所有变量,并在包中将它们设置为 ReadOnly

如果我为 Attachment 包变量指定了值,那么一切正常,但如果我没有,那么我的脚本就会失败。当我用脚本发送电子邮件时,我并不总是想发送附件。我希望修改代码,以便如果在BIDS的SSIS包中没有为我的 Attachement 变量指定值,那么我的脚本任务只会在正文中发送消息而不会失败。 / p>

如果可能的话,发送附件时也希望能够发送多个附件。我也意识到,现在我已经设置了我的脚本,因为我似乎不再需要SSIS中的 SendMail Task ,所有内容都可以从脚本和我在SSIS中设置的变量中完成。

我是否应该能够将 Script Task 连接到 Send Mail Task 以使它们协同工作?

这是我的脚本任务代码:

Imports System
Imports System.Data
Imports System.Math
Imports Microsoft.SqlServer.Dts.Runtime
Imports System.Net.Mail
Imports System.Net

<System.AddIn.AddIn("ScriptMain", Version:="1.0", Publisher:="", Description:="")> _
<System.CLSCompliantAttribute(False)> _
Partial Public Class ScriptMain
Inherits Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase

Enum ScriptResults
    Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success
    Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
End Enum

Public Sub Main()

    MsgBox(Dts.Variables("Username").Value.ToString)

    Dim myHtmlMessage As MailMessage
    Dim mySmtpClient As SmtpClient

    Dim mailAuthentication As System.Net.NetworkCredential
    mailAuthentication = New System.Net.NetworkCredential( _
        Dts.Variables("Username").Value.ToString(), _
        Dts.Variables("Password").Value.ToString())

    myHtmlMessage = New MailMessage( _
         Dts.Variables("From").Value.ToString(), _
         Dts.Variables("To").Value.ToString(), _
         Dts.Variables("Subject").Value.ToString(), _
         Dts.Variables("Body").Value.ToString())

    myHtmlMessage.Attachments.Add(New Attachment(Dts.Variables("Attachments").Value.ToString))
    mySmtpClient = New SmtpClient(Dts.Variables("SMTPServer").Value.ToString(), Dts.Variables("Port").Value.ToString())
    mySmtpClient.UseDefaultCredentials = False

    mySmtpClient.Credentials = mailAuthentication
    mySmtpClient.EnableSsl = True
    mySmtpClient.Send(myHtmlMessage)
    Dts.TaskResult = ScriptResults.Success

End Sub

End Class

2 个答案:

答案 0 :(得分:1)

在将值添加到邮件附件之前检查变量的逻辑

  • 更改脚本中的以下行,使用函数 Attachments 检查变量 String.IsNullOrEmpty 中的值是否为空

  • 在内部使用包变量时,最好在变量范围前添加 User:: System:: Script Task

  • 要再添加一个条件,您可以使用函数 System.IO.File.Exists 检查文件是否确实存在于指定路径中,然后再将其添加到邮件附件中。

自:

myHtmlMessage.Attachments.Add(New Attachment(Dts.Variables("Attachments").Value.ToString))

要:

Dim attachment As String = Dts.Variables("User::Attachments").Value.ToString()

If Not String.IsNullOrEmpty(attachment) Then
    If System.IO.File.Exists(attachment) Then
        myHtmlMessage.Attachments.Add(New Attachment(attachment))
    End If
End If

答案 1 :(得分:1)

“我不应该将脚本任务连接到发送邮件任务以使它们一起工作吗?”

您可以使用Expressions(第三个标签)使Send Email Task动态。表达式允许您根据值在SSIS包中执行任何操作。如您所见,您需要修改的大多数属性都显示在下拉列表中。

enter image description here