【问题标题】:VB 6 data access affected by MsgBox受 MsgBox 影响的 VB 6 数据访问
【发布时间】:2012-04-04 21:47:49
【问题描述】:

这个问题非常奇怪。我提交它是希望有人可能以前看过它并知道解决方法。

环境 VB6、SQL 2005、Citrix XenApp 6.5。此行为仅在从 Citrix 客户端运行时出现。

上下文:

Main .bas 模块加载并在 Main 子模块中调用 SQL server (2005) 使用 ADO 记录集加载数据。从控制台运行时,应用程序会在 1 或 2 秒内加载并显示。当从 Citrix 客户端调用时,它会减慢至少 30 倍。但是,如果我们放置一个 MsgBox

MsgBox "测试消息..."

在 Main sub 的代码中,它在 1 到 2 秒内加载,就像从控制台加载一样。 MsgBox 必须在加载用作应用程序视觉背景的 MDI 表单之后放置。如果在加载 MDI 之前放置,则不能解决问题。

通过在 MDI 表单的标题中放置调试消息,我们检测到遍历记录集所花费的时间是所有时间都被添加进去的地方。

问题是 MsgBox 语句如何影响记录集的访问速度。听起来很奇怪,但有了 MsgBox 语句:快,没有它:非常慢。

Sub Main 的简化版本如下所示,带有神奇的 MsgBox。

****************************************************************
*
****************************************************************
Sub Main()
On Error GoTo errHandler



'CSR 527
If Not ReadIniFiles Then
    MsgBox "Error reading ini files...contact systems.", vbExclamation
    End
End If

g_SecurityInClause = "YES"

If Not SetSecurity Then
    MsgBox "Unable to acquire your authorization credentials. Exiting..."
    Exit Sub
End If

Set cn = New Connection
With cn
 ' .ConnectionTimeout = 30
  .ConnectionString = CONNECTION_STRING
  .Open 'Options:=adAsyncConnect
End With

App.HelpFile = App.path & "\xx.chm"

g_bExiting = False

frmMain.MousePointer = vbHourglass
DoEvents
frmMain.Show

MsgBox "test"  <== PLACING THIS MSGBOX HERE SPEEDS UP APP BY A FACTOR OF AT LEAST 30
                   IF IT IS ABOVE frmMain.Show IT HAS NO EFFECT

'assign connection string and record source to ado controls
'PLOG 74

Load frmA


frmA.Adodc1.ConnectionString = CONNECTION_STRING
frmA.Adodc2.ConnectionString = CONNECTION_STRING
frmA.Adodc3.ConnectionString = CONNECTION_STRING

'timeouts for Phoenix
frmA.Adodc1.CommandTimeout = 300
frmA.Adodc2.CommandTimeout = 500
frmA.Adodc3.CommandTimeout = 500

frmA.Adodc1.RecordSource = "select some stuff"
frmA.Adodc2.RecordSource = "select some stuff"
frmA.Adodc3.RecordSource = "select some stuff"

frmA.Adodc1.Refresh
frmA.Adodc2.Refresh
frmA.Adodc3.Refresh

LoadMinorCodes
DetermineDeleteAccess
LoadStates

frmMain.MousePointer = vbNormal
frmStartBoard.Show


Exit Sub


errHandler:
MsgBox Err.Number & " " & Err.Description & " Main"


End Sub

【问题讨论】:

  • 用 DoEvents 替换测试 msgbox 是否会得到相同的结果?
  • 您为什么使用 ADODC(ADO 数据控制)来访问您的数据?您可以在任何地方使用 ADODB 访问您的数据,而无需使用任何表单或控件。
  • 如果你在Load frmA之后移动那个MsgBox会发生什么?
  • 谢谢! DoEvents 做到了。至于 ADODC ......这都是遗留的东西,我们将在不久的将来用 C# 替换这个旧的战马,所以没有重构它。再次感谢。

标签: vb6 citrix


【解决方案1】:

从 jac 的评论来看,添加一个 DoEvents,从它对你有用的事实来看,它一定只是一个竞争条件问题。在显示表单之前,它可能正在等待数据库连接。添加 doEvents 更改了该顺序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多