【问题标题】:Trying to use a VB Script in an SSIS package to get the Server name from a connection尝试在 SSIS 包中使用 VB 脚本从连接中获取服务器名称
【发布时间】:2013-07-11 18:31:29
【问题描述】:

我正在编写一个使用 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 来解析它。我希望有一种方法可以进入连接对象并查看服务器名称属性,但我一直无法找到它。

【问题讨论】:

    标签: sql-server vbscript ssis sql-server-2008-r2


    【解决方案1】:

    对于 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

    【讨论】:

    • 好的,这可能是一个愚蠢的问题,但我可以将Dts.Events.FireInformation 函数设置为字符串还是只是将值放入日志中的某个位置?
    • 是的,你不需要那个——它只是将值输出到日志中,用于调试。 dbServer 是我的示例中存储服务器名称的字符串。
    • 啊,所以 dbServer 包含ServerName\InstanceName。太棒了,谢谢。
    • 我在 SqlConnection 上遇到错误。就是说不存在有什么我需要包含的东西才能让它工作吗?
    • 很抱歉,我很痛苦。我现在收到此错误:Error: 0x1 at Email for Correct Counts Push 1: System.Reflection.TargetInvocationException: 调用目标已引发异常。 ---> System.InvalidCastException:无法将“System.__ComObject”类型的 COM 对象转换为“System.Data.SqlClient.SqlConnection”类类型。表示 COM 组件的类型的实例不能转换为不表示 COM 组件的类型;但是,只要底层 COM 组件支持对接口的 IID 的 QueryInterface 调用,它们就可以转换为接口。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多