在VC++程序中显示存储过程的执行进度
2009-04-25 00:25
253 查看
网上查了不少文章,要想在程序中显示存储过程的进度还是有些困难,只能变通一下了。
原理:在存储过程中自己估算执行的进程,比如存储过程需要执行100次数据插入操作,那么基本上每执行一次插入语句存储过程就执行了1%,然后想办法把这个百分比传递出去就行了。传递也没想到什么好办法,就在数据库中建个进度表,两个字段,一个ID,一个进度值。存储过程中每进行一段操作就更新一下这个进度值,这样其他程序就可以通过读取进度表获得存储过程执行的进度了。最后当存储过程结束时,删掉进度表中的数据。
原理还是比较容简单,但有些问题:
1、并发问题:多个程序同时请求这个存储过程时,进度表就乱了
解决:在存储过程的参数里加个GUID,就是SqlServer newid()函数出来的值,主要用来标识一次存储过程的执行,由于每次的GUID都不同,所以并发时,存储过程更新的是进度表种不同的数据,不会有混乱的现象。另外,存储过程结束前一定要删除该次操作的进度数据,以免进度表中堆积过的无用数据。
2、阻塞问题:当程序执行存储过程时,整个程序会发生阻塞,导致读进度的程序部分无法执行,直到存储过程结束,这样进度读取就没有意义了。
解决:多线程。为执行存储过程的部分创建一个线程,这样程序的主线程就不会阻塞了,再在开始执行存储过程的时候设置一个Timer,每隔一段时间就读一次进度值(根据GUID读取)。
原理:在存储过程中自己估算执行的进程,比如存储过程需要执行100次数据插入操作,那么基本上每执行一次插入语句存储过程就执行了1%,然后想办法把这个百分比传递出去就行了。传递也没想到什么好办法,就在数据库中建个进度表,两个字段,一个ID,一个进度值。存储过程中每进行一段操作就更新一下这个进度值,这样其他程序就可以通过读取进度表获得存储过程执行的进度了。最后当存储过程结束时,删掉进度表中的数据。
原理还是比较容简单,但有些问题:
1、并发问题:多个程序同时请求这个存储过程时,进度表就乱了
解决:在存储过程的参数里加个GUID,就是SqlServer newid()函数出来的值,主要用来标识一次存储过程的执行,由于每次的GUID都不同,所以并发时,存储过程更新的是进度表种不同的数据,不会有混乱的现象。另外,存储过程结束前一定要删除该次操作的进度数据,以免进度表中堆积过的无用数据。
2、阻塞问题:当程序执行存储过程时,整个程序会发生阻塞,导致读进度的程序部分无法执行,直到存储过程结束,这样进度读取就没有意义了。
解决:多线程。为执行存储过程的部分创建一个线程,这样程序的主线程就不会阻塞了,再在开始执行存储过程的时候设置一个Timer,每隔一段时间就读一次进度值(根据GUID读取)。
相关文章推荐
- [VB.NET]点net写client程序传递参数给mssql存储过程insert,为什么要反复执行客户端代码才能成功insert,怎么才能使客户端插入记录操作变得稳定呢?
- 解决存储过程执行快,但程序调用则执行慢的问题
- VC++中的MFC程序的执行过程
- VC++中的MFC程序的执行过程
- vc隐藏执行程序,即不显示窗体执行
- VC++中的MFC程序的执行过程
- 程序执行存储过程比查询分析器慢的解决方法
- 解决存储过程执行快,但程序调用则执行慢的问题
- 解决存储过程执行快,但程序调用则执行慢的问题
- 通过分析exevc系统调用处理过程来理解Linux内核如何装载和启动一个可执行程序
- VC++中的MFC程序的执行过程
- easyUI中程序执行时显示进度条
- 解决存储过程执行快,但程序调用则执行慢的问题
- 解决存储过程执行快,但程序调用则执行慢的问题
- VC++中的MFC程序的执行过程
- VBA代码执行过程中,显示程序的运行状态
- 解决存储过程执行快,但程序调用则执行慢的问题
- C程序显示执行进度信息
- 一个关于继承的程序,求高人解释程序执行过程中内存的数据存储情况
- 解决存储过程执行快,但程序调用则执行慢的问题