日期:2014-05-17  浏览次数:20923 次

C#中如何启动SQL命令之后,忽略返回值,直接继续运行程序?
老革命碰到新问题,希望各位指点.
我自己写的EXE程序,程序会收集数据,收集完之后,在最后一步会调用一个SQL存储过程,处理已经存储的数据,但是这个存储过程会处理好几百万条数据,处理时间会有近10分钟,默认Timeout时间不够,我也不想增加等待时间,因为我也不需要返回值.
怎么样能不等待执行完毕,直接结束程序?

一般像这种都会做SSIS包,但是我不想搞太复杂,还有什么办法解决?

------解决方案--------------------
增加timeout时间,然后用一个线程来执行这个sql语句,呵呵,也挺复杂的,
------解决方案--------------------
或者用BeginExecuteNonQuery异步执行存储过程,
------解决方案--------------------
调用command的异步方法或者开一个线程去执行
------解决方案--------------------
那你就建个触发器,触发了去处理数据。
存储过程只需要去触发这个触发器就行了。
触发后存储过程就结束了。不需要等待。
------解决方案--------------------
用多线程只能解决不用等待的问题,你可以处理其它事情去,但是如果想关闭程序则不行,那样会中断SQL的执行过程的,不过你可以在关闭程序的事件中,判断SQL执行的那个线程是否还在运行,如果还在运行就将程序界面隐藏了,并等待所有后台线程运行完毕再退出。
------解决方案--------------------
引用:
那你就建个触发器,触发了去处理数据。
存储过程只需要去触发这个触发器就行了。
触发后存储过程就结束了。不需要等待。

错!
触发器是存储过程执行的一部分,如果触发器执行过程中出错,直接会在存储过程执行中返回错误信息,触发器本身没有事务概念,如果存储过程中使用了Begin Tran开启事务,那么触发器就和存储过程处于同一个事务中,要回滚是一起回滚的。
------解决方案--------------------
在sqlserver里做个作业,作业里调那个存储过程
直接调度那个作业,调完直接退出,让作业去执行存储过程
------解决方案--------------------
知道为什么代理作业管理程序里执行代理可以直接关闭吗?因为那个界面只是管理界面,并非真正执行代理的进程,有个后台服务用来执行代理,如果你在执行代理过程中,将那个服务给停止了,代理必定执行失败。同理,自己的程序也是,想要随时停止只能找个后台服务常驻。
------解决方案--------------------
Sql 代理是有一个常驻内存的服务来处理事物。
楼主也可以写一个服务来单独处理大事物,然后把Timeout设置成0 就可以解决了。