如果你的packages在执行的过程中有没有被捕获到的异常,则sqldumper会跳出来获取这些异常信息输出,存在下面的目录中:

C:\Program Files\Microsoft SQL Server\110\Shared\ErrorDumps

文件有以.tmp和mdmp结尾.

SQLDUMPER_ERRORLOG.log

通常这个时候整个package就会被hang住,如果你使用Dtsdebughost.exe(即在VS)中测试时,

如果你直接使用dtexec.exe来操作,可能dtexec就已经崩溃了.stop working.

我的包中使用到了多线程进行数据加载,如果线程中出现了异常,package会在测试时hang住,所以我就进行了下面的测试.

我在Package中使用了一个scripttask,new 了三个线程执行一些简单的测试操作.

我特意让子线程抛出一些测试异常,我们在主线程中无法捕获这些子线程抛出的异常.

但是我使用appdomain.currentdomain.unhandleexception方法来捕获处理这些异常.

第一次测试的结果是:

sqldumper跳出来,然后pacakge就一直running,SSDT中显示包已经执行完成.但是其onPostExecute事件并未被执行.

从processinginfo中可以看到unhandleexception绑定的事件处理方法已经执行了.

界面中一直hang住的情况,我分析是有些线程没有被中止

然后我就开始了第二次尝试,

在处理未捕获异常的事件处理方法中加入处理线程的方法,我让每一个线程在启动前都加入一个list<thread>对象.

处理的时候,先捕获异常信息,然后输出线程的状态,最后abort线程.我发现task顺利完成了.

第三次测试,我在Package的OnQueryCancel中加入一个scriptask,但其中故意生成一个异常,scripttask也会被hang住,

因为我发现在package的执行过程中,onquerycancel事件会被不定期触发,只要我们的System::Cancel变量是false.

在bookonline上查找相关onquercancel的说明,它会不定期触发,你可以通过设置system::cancel变量的值通知它停止运行,它给了你这样的一个机会,终止任务的执行.

我想到了MSDN论坛上有一个人问题的问题,他说如果package的执行时长超过10分钟,就需要它自动停止,其实就可以使用类似这样的方法,如果package执行时长超过10分钟,就把它的System::Cancel值置为true即可.

在package中的代码如下:

 bool isreuse = false;
List<Thread> _listworkthreads = new List<Thread>();
object internalsyncobj = new object();
/// <summary>
/// This method is called when this script task executes in the control flow.
/// Before returning from this method, set the value of Dts.TaskResult to indicate success or failure.
/// To open Help, press F1.
/// </summary>
public void Main()
{
// TODO: Add your code here
AppDomain.CurrentDomain.UnhandledException += HandleException; Dts.TaskResult = (int)ScriptResults.Success; string mymsg = "thread :" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString()
+ " domainid:"
+ System.Threading.Thread.GetDomainID().ToString()
;
Dts.Events.FireInformation(, "showmsg", mymsg, "", , ref isreuse); int times = ;
bool isused = false;
while (times < )
{
times++;
Dts.Events.FireInformation(, "showmsg", times.ToString(), "", , ref isreuse);
if (times == && !isused)
{
Dts.Events.FireInformation(, "showmsg", "update var_threadcount to 2", "", , ref isreuse);
Dts.Variables["var_threadcount"].Value = ;
//try { Dts.VariableDispenser.Reset(); }catch { }
isused = true;
}
} runNewThread("test"); Thread th = new Thread(
obj =>
{
throw new Exception("hello exception in thread");
});
lock (internalsyncobj) { _listworkthreads.Add(th); }
th.Start(); System.Threading.Thread.Sleep( * );
} void runNewThread(string msg)
{
Thread th = new Thread(
obj =>
{
Dts.Events.FireInformation(, "showmsg", msg, "", , ref isreuse);
string mymsg = "thread :" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString()
+ " domainid:"
+ System.Threading.Thread.GetDomainID().ToString()
;
Dts.Events.FireInformation(, "showmsg", mymsg, "", , ref isreuse); Thread t = new Thread(() =>
{
throw new Exception("hello exception in child thread!");
});
lock (internalsyncobj) { _listworkthreads.Add(t); }
t.Start();
}
);
lock (internalsyncobj) { _listworkthreads.Add(th); }
th.Start(msg); } void HandleException(object sender, UnhandledExceptionEventArgs e)
{
Dts.Events.FireInformation(, "UnhandleException",
"sender:" + sender.ToString() +
"message:" + ((Exception)e.ExceptionObject).Message
, "", , ref isreuse); //handle child thread
lock (internalsyncobj)
{
Dts.Events.FireInformation(,"AppdomainUnhandleException", "thread count:" + _listworkthreads.Count.ToString()
+ " start to kill all child thread at time:" + DateTime.Now.ToString()
, "", , ref isreuse);
foreach (Thread th in _listworkthreads)
{
Dts.Events.FireInformation(, "ThreadState", "thread state:" + th.ThreadState.ToString()
+ DateTime.Now.ToString()
, "", , ref isreuse); try {
th.Abort(); }
catch (Exception ex) { }
}
} }

SSIS hang with unhandle exception的更多相关文章

  1. .NET Core学习笔记(7)——Exception最佳实践

    1.为什么不要给每个方法都写try catch 为每个方法都编写try catch是错误的做法,理由如下: a.重复嵌套的try catch是无用的,多余的. 这一点非常容易理解,下面的示例代码中,O ...

  2. 201521123034 《Java程序设计》第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前 ...

  3. .net开发COM组件之组件签名&注册

    基于.net的COM组件开发时,若采用vs强命名方式,则完成后试图将组件注册到XP系统(确切的说是.net4.0以下版本的系统) REGASM c:\libcom\dotnet\myCom.dll / ...

  4. 异常处理与MiniDump详解(1) C++异常(转)

    异常处理与MiniDump详解(1) C++异常 write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie 讨论新闻组及文件 一.   综述 我很少敢为自己写 ...

  5. [SSIS] 在脚本里面使用数据库连接字符串进行查询等处理, 入坑

    入坑.!!!!! SSIS 中dts包 设置的  ADO.Net连接, 在传入脚本的时候, 我要使用 数据库连接,进行数据的删除操作. 于是我使用了 了如下的 代码 使用的是windows 身份验证, ...

  6. Writing to a MySQL database from SSIS

    Writing to a MySQL database from SSIS 出处  :  http://blogs.msdn.com/b/mattm/archive/2009/01/07/writin ...

  7. c#控制台調用SSIS包互传值

    有时候不仅仅需要在内部执行package包,多数情况下,是需要在外部进行调用,比如,需要一个批处理或者控制台程序进行外部调用SSIS包,而往往这个包所配置的连接字符串是经过加密处理的,所以当外部调用S ...

  8. 关于SSIS中解密FTP字符串的方法

    FTP(File Transfer Protocol),是文件传输协议的简称.用于Internet上的控制文件的双向传输.同时,它也是一个应用程序(Application).用户可以通过它把自己的PC ...

  9. 效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中【附源代码下载】) 转

    效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中[附源代码下载])    本文目录: (一)背景 (二)数据库数据导入到Excel的方法比较   ...

随机推荐

  1. C#代码反编译 得到项目可运行源码

    C#代码反编译 得到项目可运行源码 摘自:http://www.cnblogs.com/know/archive/2011/03/15/1985026.html 谈到"C#代码反编译&quo ...

  2. ActiveReports 报表应用教程 (6)---分组报表

    在 ActiveReports 中可以设置单级分组.嵌套分组,同时,还可以使用表格.列表以及矩阵等数据区域控件对数据源进行分组操作.分组报表在商业报表系统中应用不胜枚举,客户信息归类统计表.商品分类统 ...

  3. MySQL备份与恢复

    1.通过mysqldump命令进行数据备份 mysql数据库的备份采用直接打包数据库文件夹(注:InnoDB引擎不支持直接拷贝数据文件备份数据库,由于使用InnoDB引擎的库或表是不能使用此种方式): ...

  4. Discuz的缓存体系

    参考文档:<http://dev.discuz.org/wiki/index.php?title=缓存机制> Discuz中涉及数据缓存的地方有: 1. session Dz的sessio ...

  5. php中的字符串常用函数(一) strpos() 子字符首次出现的位置

    strpos($str, $needle); 1.返回$needle在$str首次出现的位置.(大小写敏感). 2.从php5开始$needle支持多字符.php4只能用单个字符. 3.能找到$nee ...

  6. 机器学习实战 - 读书笔记(05) - Logistic回归

    解释 Logistic回归用于寻找最优化算法. 最优化算法可以解决最XX问题,比如如何在最短时间内从A点到达B点?如何投入最少工作量却获得最大的效益?如何设计发动机使得油耗最少而功率最大? 我们可以看 ...

  7. PHP学习笔记:万能随机字符串生成函数(已经封装好)

    做验证码用到的,然后就把这个函数封装起来,使用时候要设置2个参数: $str设置里要被采集的字符串,比如: $str='efasfgzsrhftjxjxjhsrth'; 则在函数里面生成的字符串就回从 ...

  8. eclipse中的web项目路径和发布好的项目路径

    现在企业开发中,我们都会创建一个javaWeb工程,在eclipse中指的是新建一个dynamic web project,创建完工程之后,我们在IDE中大体看到如下的工程目录: 我们主要关心的文件夹 ...

  9. ThoughtWorks.QRCode生成二维码

    首先引用需要的dll,此处使用的是ThoughtWorks.QRCode.dll,网上可以找到对应的,此处也有一份,点击下载 http://files.cnblogs.com/files/ives/T ...

  10. ORACLE 中ROWNUM用法总结!

    ORACLE 中ROWNUM用法总结! 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=) ...