Anzahl Verbindugen ermitteln mit exec sp_who '???'

22/10/2008 - 08:25 von Thomas | Report spam
Hallo,
ich will die Anzahl der Verbindung eines bestimmten Benutzers auf dem SQL
Server ermitteln.
Dazu verwende ich
exec sp_who 'Benutzer'
Das geht auch soweit ganz gut. Jedoch verwende ich VB6 und habe eine
Connection erstellt und habe verschiedene Recordsets offen.


Wenn ich andere RecordSets offen habe, gibt mit die Prozedur
exec sp_who 'Benutzer'
jedoch immer eine Prozess mehr zurück, als ich erwartet habe.
Beispiel:
Ich habe eine Connection
Ein Prozess
Ich öffne einen Recorset
Ein Prozess
Ich öffnen einen zweiten Recorset
Ein Prozess
Ich frage mit sp_who ab, wieviele Prozesse offen sind.
Zwei Prozesse (obwohl eigentlich nur einer da sein sollte!!!)


Ich hoffe ihr versteht mein Problem.
Kann mir jemand helfen?

Zur Info: Ich brauche den Server seitigen Cursor. Also kann ich diesen nicht
auf Client àndern!


Anbei mein VB6 Code.

Private Sub Command1_Click()
Dim DBName As String
Dim ConTest As ADODB.Connection
Dim SQLProvider As String
Dim UserName As String
Dim PWD As String
Dim Server As String
Dim AnzahlUserAufDatenbank As Long

UserName = "Benutzer"
PWD = "Passwort"
DBName = "Datenbank"
Server = "Servername"

SQLProvider = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID="
& UserName & ";Password=" & PWD & " ;Initial Catalog=" & DBName & ";Data
Source=" & Server



Set ConTest = New ADODB.Connection
ConTest.ConnectionString = SQLProvider
ConTest.Open
MsgBox "Datenbank wurde geöffnet"

Dim rsTEst As ADODB.Recordset
Set rsTEst = New ADODB.Recordset
Dim rsTEst2 As ADODB.Recordset
Set rsTEst2 = New ADODB.Recordset
Dim rsTEst3 As ADODB.Recordset
Set rsTEst3 = New ADODB.Recordset




With rsTEst
.ActiveConnection = ConTest
.CursorLocation = adUseServer

End With

rsTEst.Open "select * from LF", , , adLockOptimistic
'rsTEst.Close


With rsTEst2
.ActiveConnection = ConTest
.CursorLocation = adUseServer

End With

rsTEst2.Open "select * from BT", , , adLockOptimistic
'rsTEst2.Close




With rsTEst3
.ActiveConnection = ConTest
.CursorLocation = adUseServer

End With

rsTEst3.Open "exec sp_who 'alacarte'", , , adLockOptimistic
AnzahlUserAufDatenbank = 0
Do While rsTEst3.EOF = False
AnzahlUserAufDatenbank = AnzahlUserAufDatenbank + 1
rsTEst3.MoveNext
Loop
rsTEst3.Close
MsgBox "Anzahl: " & AnzahlUserAufDatenbank

ConTest.Close
MsgBox "Datenbank wurde geschlossen. Es wurden 10 Datensàtze geschrieben"

End Sub
 

Lesen sie die antworten

#1 Peter Götz
22/10/2008 - 13:14 | Warnen spam
Hallo Thomas,

With rsTEst
.ActiveConnection = ConTest



Hier weist Du Deinem rsTest nicht einen Verweise auf die
bereits bestehende ConTest zu, sondern erzeugst eine
neue Instanz einer Connection.
RS.ActiveConnection erwartet einen Verweis auf ein
Objekt, Du übergibst aber das Objekt. Also sucht VB
nach der Default-Eigenschaft dieses Objektes (das
ist der ConnectionString) und erstellt mit dieser Information
eine neue Instanz eines Connectionobjektes und schon
erkennt Dein DB-Server nicht mehr nur eine Verbindung
sondern deren zwei.


Richtig wàre

Set .ActiveConnection = ConTest


.CursorLocation = adUseServer



Möchtest Du wirklich mit serverseitigem Cursor arbeiten?
Das ist die ressourcenhungrigste aller denkbaren Varianten
und nur in den wenigsten Fàllen wirklich empfehlenswert.


End With



Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

Ähnliche fragen