2012-04-04 11 views
3

Dieses Problem ist mehr als seltsam. Ich gebe es in der Hoffnung ein, dass jemand es schon einmal gesehen hat und eine Lösung kennt.VB 6 Datenzugriff von MsgBox betroffen

Umgebung VB6, SQL 2005, Citrix XenApp 6.5. Dieses Verhalten tritt nur bei der Ausführung von einem Citrix Client auf.

Der Kontext:

Haupt .bas Modul lädt und in dem Hauptunter nennt es SQL Server (2005) ADO-Datensatz unter Verwendung von Daten zu laden. Wenn die App über die Konsole ausgeführt wird, wird sie in 1 oder 2 Sekunden geladen und angezeigt. Wenn man von einem Citrix-Client aufgerufen, es verlangsamt sich um einen Faktor von mindestens 30. Wenn wir jedoch eine MsgBox platzieren

dh

MsgBox „Test Nachricht ...“

im Code der Main-Sub, es lädt in 1 bis 2 Sekunden genau wie die Last von der Konsole. Die MsgBox muss nach dem Laden des MDI-Formulars platziert werden, das als visueller Hintergrund für die App fungiert. Wenn es platziert wird, bevor das MDI geladen wird, behebt es das Problem nicht.

von Debug-Meldungen in der Titelzeile des MDI-Formular platzieren, haben wir die Zeit erfasst sie über einen Datensatz zu gehen braucht, wo die ganze Zeit in hinzugefügt wird.

Die Frage ist, wie kann eine MsgBox-Anweisung Auswirkungen auf die Zugriffsgeschwindigkeit eines Recordsets. Klingt sehr seltsam, aber mit der MsgBox-Anweisung: schnell, ohne es: tödlich langsam.

Eine reduzierte Version des Sub Main ist unten mit der magischen MsgBox angegeben.

**************************************************************** 
* 
**************************************************************** 
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 
+3

Ersetzt das Ersetzen der Test-msgbox mit einem DoEvents die gleichen Ergebnisse für Sie? – jac

+0

Warum verwenden Sie ADODC (ADO Data Control), um auf Ihre Daten zuzugreifen? Sie können von überall auf Ihre Daten mit ADODB zugreifen, ohne ein Formular oder eine Steuerung zu verwenden. – Martin

+0

Was passiert, wenn Sie diese MsgBox nach 'Load frmA' verschieben? – tcarvin

Antwort

0

Von jac Kommentar, eine DoEvents, und aus der Tatsache hinzufügen, dass es für Sie gearbeitet, muss er nur ein Race-Bedingung Problem gewesen. Wahrscheinlich wartete die Datenbank auf die Verbindung, bevor das Formular angezeigt wurde. Durch Hinzufügen der doEvents wurde diese Reihenfolge geändert.