在SSIS中使用多个连接字符串
这是我关于stackoverflow的第一个问题,我希望能尽快找到答案。 我需要创建一个包(SSIS),从一个源提取数据,然后过滤数据并将其推送到多个服务器。因此,我尝试使用executesql任务查询连接字符串,然后在每个连接上使用Foreach循环容器循环。我是根据[shree-pat18]提出的建议来做这件事的(这就解释了一切) 但其中一个主要问题是,大多数时候网站的连接都很糟糕。因此,我希望在继续下一步之前确保连接正常。如果连接速度慢或离线,我希望跳过该站点,并跳转到下一个迭代,跳过所有其他任务。在SSIS中使用多个连接字符串,ssis,Ssis,这是我关于stackoverflow的第一个问题,我希望能尽快找到答案。 我需要创建一个包(SSIS),从一个源提取数据,然后过滤数据并将其推送到多个服务器。因此,我尝试使用executesql任务查询连接字符串,然后在每个连接上使用Foreach循环容器循环。我是根据[shree-pat18]提出的建议来做这件事的(这就解释了一切) 但其中一个主要问题是,大多数时候网站的连接都很糟糕。因此,我希望在继续下一步之前确保连接正常。如果连接速度慢或离线,我希望跳过该站点,并跳转到下一个迭代,跳过所有
如果有人有更好的解决方案,我愿意接受建议,提前谢谢 欢迎来到stackoverflow 我看到您使用脚本任务作为每个循环容器的的第一步 想法 我不知道你在这个脚本任务中到底在做什么,但我建议你更新它,以检查与站点的连接是否正常工作,是否足够快,符合你的要求 拟议的解决办法 我假设您正在使用C#作为脚本语言
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;
}
希望这能有所帮助。我几乎在我编写的每个包中都使用了一个名为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;
}
}
}
让我试试,我会让你知道的。感谢您的快速回复[@Sam]