在SSIS中使用多个连接字符串

时间:2014-10-09 09:41:43

标签: ssis

这是我关于stackoverflow的第一个问题我希望能快速看到答案。 我需要创建一个包(SSIS),从一个SOURCE中提取数据,然后过滤数据并将其推送到多个服务器。所以我尝试使用Execute SQL Task查询connectionStrings,然后在每个连接上使用Foreach循环容器循环。我已经通过this问题中的[ shree-pat18 ]建议完成了此操作(此image解释了所有内容。)

但其中一个主要问题是网站的连接大部分时间都很糟糕。因此,如果连接速度很慢或处于脱机状态,我想确保连接在继续下一步之前有效。我想跳过该站点并转到下一次迭代,跳过所有其他任务。 如果有人有更好的解决方案来做到这一点,我会提前感谢你的建议。

2 个答案:

答案 0 :(得分:1)

欢迎来到stackoverflow!

我发现您使用脚本任务作为 For Each Loop 容器的第一步。

想法

我不确切地知道您在此脚本任务中正在做什么,但我建议您更新它以检查与网站的连接是否正常并且根据您的要求足够快。

提议的解决方案

我假设你使用C#作为脚本语言。

  1. 在包级别创建 isSiteLive 变量作为布尔值 False
  2. 使用脚本任务编辑器在脚本任务中将其设置为 ReadWriteVariables
  3. screenshot

    1. 然后,更新您的脚本以ping远程站点以检查它是否是实时的。您还可以根据您的要求设置可接受的超时
    2. 您可以使用以下代码:

      public static bool PingHost(string nameOrAddress, int timeout)
       {
          bool pingable = false;
          Ping pinger = new Ping();
      
          try
          {
              PingReply reply = pinger.Send(nameOrAddress, timeout);
      
              pingable = reply.Status == IPStatus.Success;
          }
          catch (PingException)
          {
              // Discard PingExceptions and return false;
          }
      
          return pingable;
       }
      
      1. 如果网站可ping,则将 isSiteLive 变量设置为 True ,否则,将其设置为 False
      2. 返回 SSIS控制流程,双击脚本任务后面的链接添加约束,选择 Expression 作为< em>评估操作并将 @ [User :: isSiteLive] 作为表达式
      3. screenshot

        1. 因此,如果网站停机或响应时间过长,循环将忽略下一个任务。
        2. 希望这有帮助。

答案 1 :(得分:0)

我在我编写的每个包中都使用了一个名为VerifyConnections的脚本任务。我很久以前就找到了这段代码,并且不记得它的来源,所以我不能赞美这位作者。 它遍历包中的所有连接,创建连接,并将结果写入日志。它发现它在开发和测试过程中非常有用。您可以轻松更改代码或将其与Sam的建议结合使用,以便它能满足您的需求。

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;

namespace VerifyConnectionsScript
{
  [System.AddIn.AddIn("ScriptMain", Version="1.0", Publisher="", Description="")]
  public partial class ScriptMain :
          Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
  {
    enum ScriptResults
    {
      Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
      Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
    };
    public void Main()
    {
      bool failure = false;
      bool fireAgain = true;
      foreach (var ConnMgr in Dts.Connections) {
        Dts.Events.FireInformation(1, "", String.Format("ConnectionManager='{0}', 
            ConnectionString='{1}'", ConnMgr.Name, ConnMgr.ConnectionString), "", 0, 
            ref fireAgain);
        try {
          ConnMgr.AcquireConnection(null);
          Dts.Events.FireInformation(1, "", 
               String.Format("Connection acquired successfully on '{0}'", 
                 ConnMgr.Name), "", 0, ref fireAgain);
          }
          catch (Exception ex) {
            Dts.Events.FireError(-1, "", 
            String.Format("Failed to acquire connection to '{0}'. Error ='{1}'", 
                     ConnMgr.Name, ex.Message), "", 0);
            Exception iex = ex.InnerException;
            while (iex != null) {
              Dts.Events.FireError(-1, "", 
              String.Format("Inner exception message='{0}'", iex.Message), "", 0);
              iex = iex.InnerException;
            }
            failure = true;
          }
        }
        if (failure)
          Dts.TaskResult = (int)ScriptResults.Failure;
        else
          Dts.TaskResult = (int)ScriptResults.Success;
      }
   }
}