我正在研究SSIS包。该包具有脚本(C#语言)任务。我需要调试脚本任务。我设定了断点。脚本编辑器(Visual Studio)中的脚本和SSIS包编辑器中的任务都显示红色的断点 - 表示断点已启用。但是,当我调试包时,断点没有命中。
断点没有任何条件,所以我希望每次打包都会打到它。
我在Windows 2003 R2 64位SP2上使用Visual Studio 2008。
答案 0 :(得分:25)
经过更多研究和反复试验后,发现在64位计算机上进行调试时,SSIS包会忽略脚本任务中的断点。解决它 -
Run64BitRunTime
设为False
。
进行此更改后,断点就像魔法一样。
答案 1 :(得分:16)
我尝试了这里提供的所有答案都没有成功(使用VS2015)。经过一些搜索后,我发现这个question that is actually an answer表示较新的C#特性/语法导致调试器无法正确触发。
在他们的例子中(也是我的)使用字符串插值导致断点不被击中。
更换
$"{someVariable} - {someOtherVariable}"
与
string.Format("{0} - {1}", someVariable, someOtherVariable);
为我做了诀窍。
答案 2 :(得分:11)
更新:伙计们,我失去了设置断点的能力(a request to MS)
我以前的修复方法如下
现在我正在使用日志记录和跟踪而不是调试。
C#新功能(在C#4.0之后)被指责用于杀死SSIS脚本任务的调试。
要返回断点功能,请执行以下操作。
最后,您必须在脚本任务上看到一个红色圆圈 (在VS 2017中测试过。)
注意即可。我不得不提一下,即使你只使用“执行任务”而不是“执行包”,调试也能正常工作!
删除C#新功能
要删除C#新功能,我可以通过两种方式为您提供建议。
首先,将Vsta项目属性限制为C#4.0(迁移的软件包可能不支持此功能)。
其次,旧/迁移包中的Vsta项目可能无法显示上述“C#语言级别”属性。
因此,您可以将代码放在Visual Studio 2010中的假项目中并在那里进行编译。
成功运行一次
修复C#后,必须成功运行脚本任务
您可能希望将return
语句放在Main()
方法的开头,以防止任何实际执行。
抱歉,这并不总是有效,我不明白为什么,但你肯定需要先修复你的C#。
至少您将获得一个有效的脚本任务,并可以通过旧方式进行调试(按Dts.Events...
记录,例外等)。
<强> TL; DR 强>
当C#新功能迫使脚本任务以成功完成状态静默失败时,我甚至遇到了严重的情况。
例如,将以下内容添加到脚本任务中。
string Bug { get; } // Only getter properties.
//...
var str = $"Now is {DateTime.Now}"; // String Interpolation in C#
//...
var dummy = val?.ToUpper(); // ?. and ?[] null-conditional Operators
此非完整列表的解决方法:
string Bug { get; set; }
//...
var str = string.Format("Now is {0}", DateTime.Now);
// etc.
我也做了什么,我在 Visual Studio 2010中构建我的C#代码。它根本不编译新的.NET功能,也不允许.NET Framework 4.0以上版本。到目前为止,非常好。
当然,这个SO问题的其他答案对我没有帮助。
答案 3 :(得分:5)
使用System.Diagnostics.Debugger类以编程方式添加断点:
System.Diagnostics.Debugger.Launch();
System.Diagnostics.Debugger.Break();
您可以检查调试器是否已连接:
if (System.Diagnostics.Debugger.IsAttached)
System.Diagnostics.Debugger.Break();
请按照以下步骤操作:
答案 4 :(得分:5)
我继承了一个SSIS包,遗憾的是上面的答案没有帮助。
最后我发现脚本任务的调试模式的构建属性已经勾选了优化代码。确保没有勾选,因为对我来说,visual studio会启动脚本调试,并在不打破后立即关闭。
相当模糊,但值得一提。
答案 5 :(得分:4)
就我而言,这些解决方案均无效。我终于知道Resharper是罪魁祸首。卸载后,它开始像魅力一样工作。
答案 6 :(得分:3)
我们最近遇到了同样的问题。对我们来说,解决方案是确保脚本任务项目被标记为运行,因为平台目标设置为x86。
答案 7 :(得分:3)
就我而言,我不得不摆脱C#6中的所有功能:字符串插值,空条件运算符(?.
,?()
,?[]
)和表达式成员( =>
)(在你的情况下可能会有更多)。你可以检查所有here。当然,这同样适用于C#7功能。
其他答案的32/64位更改没有帮助,所以我回滚了这些并且调试保持正常工作。
答案 8 :(得分:2)
除了Jeff的建议外,还要将Platform Target更改为“x86”(在脚本的属性'Build选项卡中。这最终让我在64位系统上再次调试。
答案 9 :(得分:1)
Microsoft发布了SQL Server Integration Services Projects的更新v3.2,它解决了Roslyn和.Net 4.5之后引入的其他C#语言功能的问题。 C#功能。
坏消息-此修复仅适用于Visual Studio 2019,您必须升级VS才能使用它。
答案 10 :(得分:0)
无论我做了什么,我的断点都没有被击中。我最后调试并使用异常抛出修复问题。一旦我解决了我遇到的问题,断点就开始了!
所以我的断点只会在代码没有遇到任何运行时问题时才会出现......这很奇怪。
答案 11 :(得分:0)
根据我的经验,这没关系:
但是有一些非常重要的东西,在任何其他答案中都没有提到:你必须运行整个包。如果运行任务或容器,则将忽略断点。
我在64位计算机上使用Visual Studio 2013.
答案 12 :(得分:0)
我只有一个脚本组件,没有命中任何断点(我正在做一些CRM东西,不需要源/目标)。 我试图用简单的fetchXML添加Source组件网(即使我不需要它)。 然后成功了! :-)
答案 13 :(得分:0)
我发现,通过复制脚本组件任务,也可以复制整个VSTA项目。这就是您所期望的,但是我没有想到的是,例如程序集名称也被复制。 运行然后执行任务可以正常工作,但是运行整个程序包实际上仅运行复制的第一个脚本,并导致在击中行处理功能之前引发异常。 这也是我未达到断点的原因。
答案 14 :(得分:0)
我花了一整天的时间来解决这个问题,这里提到的解决方案都没有对我有用。
就我而言,现有项目的目标是 SQL Server 2016,它默认使用 ScriptLanguage Microsoft Visual c# 2015。这不允许在 VS 2019 中进行调试。我必须将项目定位到 SQL Server 2019 才能进行调试。当然,我不打算签入版本更改。只是为了调试脚本。脚本运行后,我会将目标版本恢复为 SQL Server 2016。
希望这可以为某人节省时间。