1

我正在编写一个使用 VB 脚本发送几封确认电子邮件的 SSIS 包。其中一封确认电子邮件需要包含来自其中一位连接管理器的服务器名称。我有一个执行以下操作的脚本:

Public Sub Main()

    '------------- Set Vriables
    Dim htmlMessageTo As String = _
      Dts.Variables("Email_To").Value.ToString
    Dim htmlMessageCC As String = _
      Dts.Variables("Email_CC").Value.ToString
    Dim htmlMessageFrom As String = _
      Dts.Variables("Email_From").Value.ToString

    Dim ServerAConnectionString As String = _
          DirectCast(Dts.Connections("ServerA").AcquireConnection(Dts.Transaction), String)
    Dim smtpConnectionString As String = _
          DirectCast(Dts.Connections("Mail1").AcquireConnection(Dts.Transaction), String)
    Dim smtpServerStr As String = _
      smtpConnectionString.Split(New Char() {"="c, ";"c})(1)

    Dim smtpServer As New SmtpClient(smtpServerStr)

    Dim myMail As New MailMessage
    With myMail
        .From = New MailAddress(htmlMessageFrom)
        .To.Add(htmlMessageTo)
        If Len(htmlMessageCC) > 0 Then
            .CC.Add(htmlMessageCC)
        End If
        .IsBodyHtml = True
        .Subject = "The process failed for server " & ServerAConnectionString 
        .Body = "The process failed for server " & ServerAConnectionString 
    End With

    smtpServer.Send(myMail)

    Dts.TaskResult = ScriptResults.Success
End Sub

我试图仅获取 ServerA 的服务器名称。连接管理器 Mail1 是我正在使用的 SMTP 服务器。我的其他字符串一切正常,但这个特殊的字符串给了我一个错误。我相信我可以得到连接字符串,但不知道足够的 VB 来解析它。我希望有一种方法可以进入连接对象并查看服务器名称属性,我只是找不到它。

4

1 回答 1

2

对于 ADO.NET 连接:

    Dim dbConn As System.Data.SqlClient.SqlConnection = Dts.Connections("ServerA").AcquireConnection(Dts.Transaction)
    Dim dbServer As String = dbConn.DataSource
    Dts.Events.FireInformation(-1, "", dbServer, String.Empty, -1, False)

它在日志中产生以下内容:

 [] Information: ServerName\InstanceName

OleDB 连接有点棘手——要在 vb 脚本中访问相同的东西,添加对 .NET 程序集 Microsoft.SqlServer.DTSRuntimeWrap 的引用,然后使用以下内容:

    Dim connectionManager As ConnectionManager = Dts.Connections("oleDBConnection")
    Dim cmParam As Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSConnectionManagerDatabaseParameters100
    cmParam = CType(connectionManager.InnerObject, Wrapper.IDTSConnectionManagerDatabaseParameters100)
    Dim conn As OleDb.OleDbConnection = CType(cmParam.GetConnectionForSchema(), OleDb.OleDbConnection)
    Dts.Events.FireInformation(-1, "", conn.DataSource, String.Empty, -1, False)

经过测试和验证的参考:http: //blogs.msdn.com/b/mattm/archive/2008/08/22/accessing-oledb-connection-managers-in-a-script.aspx

于 2013-07-11T18:51:22.393 回答