我现在处理存储过程中,需要处理大量的数据,总是会出现假死的状态,要怎么解决呢,多谢大家了!!!

ken2002 2008-11-10 11:56:56
我现在处理存储过程中,需要处理大量的数据,总是会出现假死的状态,就是出现了未响应,要怎么解决呢,多谢大家了!!!

用了DoEvents也不行呀!

Set Rst = New ADODB.Recordset
Set Cmd = New ADODB.Command
Cmd.ActiveConnection = Cnxn
DoEvents
Cmd.CommandText = "存储过程"
DoEvents
Cmd.CommandType = adCmdStoredProc
DoEvents
Set Rst = Cmd.Execute
DoEvents
Set Cmd = Nothing
Set Rst = Nothing
...全文
358 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
fj182 2008-11-19
  • 打赏
  • 举报
回复
adAsyncExecute
ken2002 2008-11-11
  • 打赏
  • 举报
回复

用sleep可以么,应该怎么使用呢,多谢大家了!
zengfanying 2008-11-11
  • 打赏
  • 举报
回复
学习
ken2002 2008-11-11
  • 打赏
  • 举报
回复
To 家人

多谢你了,我先看看一下,因为我要实现的是异步实现SQL中所有的作业,不知能不能实现,我先试一下,多谢你了!
vbman2003 2008-11-11
  • 打赏
  • 举报
回复

'--------------------------------- ActiveX.exe ----------------------------

'新建一个ActiveX.exe工程名称: Test_ActiveX
'其中类名称: cTest
'添加一个窗体,名称: fTest
'窗体上加一个Timer控件,名称TM
'cTest上添加如下代码:

Option Explicit

Private frm As Form
Private WithEvents oTM As Timer
Public Event TestStart() '开始事件
Public Event TestEnd() '结束事件

Private FG As Object '本例中用来模拟传入数据的表格控件

Private Sub Class_Initialize()
Set frm = New fTest
Load frm
Set oTM = frm.TM
oTM.Enabled = False
End Sub

Private Sub Class_Terminate()
Set oTM = Nothing
Unload frm
End Sub

'这个方法用来通知本程序开始执行任务
Public Function StartTest(mData As Object) As Boolean
'参数mData可以是你要插入的数据对象,此例中传入一个表格控件
Set FG = mData '实例化FG
'延时一下
oTM.Interval = 100
oTM.Enabled = True
StartTest = True
End Function

'插入数据到数据库,具体代码自己写了,这里只是模拟一个较长时间的操作
Private Sub DataToDB()
'Dim cn As connection
Dim r As Long, c As Long
For r = 1 To FG.Rows - 1
For c = 1 To 300
Debug.Print FG.Text
Next
Next
End Sub

Private Sub otm_Timer()
oTM.Enabled = False
RaiseEvent TestStart '触发TestStart事件
DataToDB '执行"数据插入"
RaiseEvent TestEnd '触发TestEnd事件
End Sub
'--------------------------------------------------------------------------



'---------------------------- 测试工程 ------------------------------------
'运行上面的Test_ActiveX
'新建一个测试工程
'在工程引用菜单下引用Test_ActiveX
'窗体上加一个command,一个Label,一个MSHFlexGrid控件
'代码:

Option Explicit

Dim WithEvents Obj As cTEST

Private Sub Form_Load()
'加入测试数据
Dim i As Long
With MSHFlexGrid1
.Cols = 2
For i = 0 To 100
.AddItem Chr(32) & vbTab & Format(i, "0000000000"), 1
Next
End With
End Sub

Private Sub Form_Unload(Cancel As Integer)
Set Obj = Nothing '释放对像
End Sub

'按键代码
Private Sub Command1_Click()
Set Obj = New cTEST
Obj.StartTest MSHFlexGrid1 '传递MSHFlexGrid1中的数据,通知执行任务
End Sub


'类中的开始事件
Private Sub Obj_TestStart()
Label1.Caption = "正在执行数据更新..."
'你也可以弄个timer控件,在其中动态提示
End Sub

'类中的结束事件
Private Sub Obj_TestEnd()
Label1.Caption = "数据更新完毕"
Set Obj = Nothing '释放对像
End Sub

'--------------------------------------------------------------------------


中饭前赶出来的,比较典型的一个ActiveX.exe示例,测试没问题...思路如此,根据情况自己修改吧
吃饭去了....
ken2002 2008-11-11
  • 打赏
  • 举报
回复
To 花1个月冲个星星玩玩

多谢你了,可以具体一些么,我把游标类型设置成客户端,也不行呀!或是我加的地方不对呢,可以帮他加一下么,多谢你了!
zuoxingyu 2008-11-11
  • 打赏
  • 举报
回复
优化一下你的存储过程

把游标类型设置成客户端

把TIMEOUT调大点看看
ken2002 2008-11-11
  • 打赏
  • 举报
回复

说明一次,我的程序是处理SQL中的所有作业,处理大的时候,就要假死,我都快要顶不住了,大家帮帮忙吧,多谢大家了!
chinawcs 2008-11-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 vbman2003 的回复:]
如果数据插入数据量太大造成假死,可以把这个过程交给一个activeX.exe去完成,这样主程序就不会假死了...
[/Quote]

这个注意不错 ocx 线程独立的 把ado .exec sp 都放里面 对外弄个接口

让主程序 调用

欣赏家人!佩服!口服!
ken2002 2008-11-11
  • 打赏
  • 举报
回复
To 花1个月冲个星星玩玩

修改存储过程是有点麻烦,因为是用到游标的,所以处理相对来说是慢了一点,有时还有提示,超时已过期,现在要知道不修改存储过程能不能解决这个问题呢,多谢你了!
zuoxingyu 2008-11-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zuoxingyu 的回复:]
优化一下你的存储过程

把游标类型设置成客户端

把TIMEOUT调大点看看
[/Quote]

昨天晚上说的,就第一句话对了,其他2个都是错的,再次说声对不起了

如果你的程序是从服务器上取数据的话,
rs.CursorLocation = adUseClient
ado.CursorLocation = adUseClient
计算都在本地进行,减少网络流量,但是有可能本机的性能不咋地,运行速度不理想
如果是从本机取数据的话
rs.CursorLocation = adUseServer
ado.CursorLocation = adUseServer
所有运算都在服务器上执行,可以有效利用服务器的高配置,但是会增加数据传递到每个客户终端的时间

ken2002 2008-11-11
  • 打赏
  • 举报
回复
To Modest

多谢你了,可我的存储过程不是select呀,我要怎么改呢,可以麻烦帮我改一下么,多谢你了!
vbman2003 2008-11-11
  • 打赏
  • 举报
回复

楼主,我有空给你写个示例吧,一会就要忙了....





[Quote=引用 8 楼 zuoxingyu 的回复:]
问下4楼的哥们,你的技术总分有5191,为什么还是5个三角?不是超过5000分就是星星了吗
[/Quote]

包含其它版块的技术分






zuoxingyu 2008-11-11
  • 打赏
  • 举报
回复
问下4楼的哥们,你的技术总分有5191,为什么还是5个三角?不是超过5000分就是星星了吗
ken2002 2008-11-11
  • 打赏
  • 举报
回复
To 家人

多谢你了,可以具体一些么,因为对这方面不太熟悉,多谢你了
vbman2003 2008-11-11
  • 打赏
  • 举报
回复
如果数据插入数据量太大造成假死,可以把这个过程交给一个activeX.exe去完成,这样主程序就不会假死了...
ken2002 2008-11-11
  • 打赏
  • 举报
回复
To 焯

多谢你了,情况确实如此,现在也想知道是不是能用进度条来控制一下呢,多谢你了!
Sandrer 2008-11-11
  • 打赏
  • 举报
回复
DoEvents 只在循环过程中不让程序进入假死
你这个情况不属于循环,程序应该卡死在 Set Rst = Cmd.Execute 这里了

其实无论你怎么优化存储过程,如果你数据量真的太多的话,那还是用多线程吧~

不过我没在VB里试过用多线程,所以不能给你代码~
迈克揉索芙特 2008-11-11
  • 打赏
  • 举报
回复
http://www.china-askpro.com/msg19/qa08.shtml
迈克揉索芙特 2008-11-11
  • 打赏
  • 举报
回复
楼主看看ADO的异步模式吧,这才是解决问题的根本。
加载更多回复(4)

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧