Meherere Connection durch MSDataShape?

10/07/2008 - 11:14 von Wilfried Dietrich | Report spam
Hallo,

zu Programmbeginn öffne ich eine Connection zu einer Jet-DB (MDB).
In der .ldb ist ein Eintrag (ein Benutzer "Admin" und ein Computername).
Das bleibt auch so, bis ich ein hierarchisches Recortdset benötige,
welches ich nach folgendem Schema mit MSDataShape (VB6) aufbaue.
Scheinbar bringt jede RELATE-Klausel (Beziehung) einen neuen
Eintrag in der .ldb dazu, sprich eine neue Connection (vermute ich).
Das funktioniert zwar, aber diese vielen Conn. stören mich.

RS.Open "SHAPE {SELECT ... FROM ... WHERE ...} As A & _
"APPEND ({SELECT ... FROM ... WHERE ...} AS B " & _
"RELATE ... TO ...) AS C, ({SELECT ... FROM ...} AS B " & _
"RELATE ... TO ...) AS D, ({SELECT ... FROM ...} AS E " & _
"RELATE ... TO ...) AS F", _
"Provider=MSDataShape.1;Data " & Cnn.ConnectionString, _
adOpenStatic, adLockReadOnly, adCmdText

Nach dessen Ausführung habe ich vier Eintràge in der .ldb
(immer gleicher Benutzer, gleicher Computername).

Meine Fragen:
1. Ist es an dem, dass dann mehrere Connection vorhanden sind
bzw. sein müssen?
2. Kann ich ein hierarchisches Recortdset mit nur einer, bestehenden
Connection, mit nur einem Eintag in der .ldb aufbauen?
3. Wenn 2. = ja, dann wie?


Vielen Dank im voraus.
MfG.
Wilfried
 

Lesen sie die antworten

#1 Peter Götz
10/07/2008 - 14:29 | Warnen spam
Hallo Wilfried,

zu Programmbeginn öffne ich eine Connection zu
einer Jet-DB (MDB).
In der .ldb ist ein Eintrag (ein Benutzer "Admin" und
ein Computername). Das bleibt auch so, bis ich ein
hierarchisches Recortdset benötige, welches ich
nach folgendem Schema mit MSDataShape (VB6)
aufbaue. Scheinbar bringt jede RELATE-Klausel
(Beziehung) einen neuen Eintrag in der .ldb dazu,
sprich eine neue Connection (vermute ich).
Das funktioniert zwar, aber diese vielen Conn. stören mich.



Das ist ein Bug in ADO im Zusammenhang mit DataShape,
der u.a. auch zur Folge hat, dass nach dem Schliessen
eines solchen RS und schliessen der Connection, weiterhin
eine Connectioninstanz im Speicher verbleibt.

Ich hatte dieses Problem vor Jahren auch in einigen
Programmen und habe mir dafür einen BugFix mit
dem PropertyBag gebaut.

Dim CnnShp as ADODB.Connection
Dim PB as PropertyBag
Set PB = new PropertyBag

Set CnnShp = New ADODB.Connection
With CnnShp
.Provider = "MSDataShape"
.CursorLocation = adUseClient
.Properties("Data Provider").Value = "Microsoft.Jet.OLEDB.4.0"
.Properties("Data Source").Value = DBName
.Properties("Persist Security Info") = False
If Len(DataBasePassword) > 0 Then
.Open "Jet OLEDB:Database Password = " & DataBasePassword
Else
.Open
End If
End With

' BUGFix per PropertyBag
With RSShape
.CursorLocation = adUseClient
.CursorType = adOpenStatic
.LockType = adLockReadOnly
Set .ActiveConnection = CnnShp
.Source = strSQL
.Open

' Recordset in PropertyBag schreiben
PB.WriteProperty "RSShp", RSShape
' und Connection schliessen
.ActiveConnection.Close
End With
' Objektverweis auf Connection zerstören
Set CnnShp = Nothing
' ... und Recordset aus PropertyBag wieder einlesen
Set RSShape = PB.ReadProperty("RSShp")
Set PB = Nothing

Nachdem das RSShape aus dem PropertyBag wieder
eingelesen ist, hat man ein verbindungsloses RS, zu
dem es keinerlei .ActiveConnection-Objekt mehr gibt.

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

Ähnliche fragen