eigenes adodb.Recordset an Access-Formular binden

02/09/2007 - 11:43 von Josef Poetzl | Report spam
Hallo!

Problem:
Eine von Adodb.RecordsetClass abgeleitete Klasse kann nicht an
Access.Form.Recordset übergeben werden.

Beschreibung:
Dieser Code funktioniert in einem Access-Formular ohne Probleme:

Dim cnn As ADODB.Connection
Set cnn = CurrentProject.Connection

Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset
rst.Open strSQL, cnn, adOpenKeyset, adLockOptimistic, 0

Set Me.Recordset = rst


Nun versuche ich eine unter VB.net erstelle Recordsetklasse zu
übergeben.
Zu Testzwecken erbte ich einfach die RecordsetClass in die Klasse
MyRecordset und ergànze eine Eigenschaft.

[VB.Net-Klasse]

<ComVisible(True)> _
<ClassInterface(ClassInterfaceType.AutoDual)> _
Public Class MyRecordset

Inherits ADODB.RecordsetClass

Public ReadOnly Property TestRecordset() As ADODB.Recordset
Get
TestRecordset = CType(Me, ADODB.Recordset)
End Get
End Property

End Class

[/vb.net]

Verwende ich nun diese Klasse, dann kracht es.
(Totalabsturz von Access)

Dim rst As ADODB.Recordset 'oder: AdoTestLib.MyRecordset
Set rst = New AdoTestLib.MyRecordset
rst.Open strSQL, cnn, adOpenKeyset, adLockOptimistic, 0

Set Me.Recordset = rst ' *bumm* ... aber richtig

Meldung:
"Access hat ein Problem festgestellt und muss beendet werden. ..."

Dieser Code führt auch zu einem Fehler:
Dim rst As AdoTestLib.MyRecordset
Set rst = New AdoTestLib.MyRecordset
rst.Open strSQL, cnn, adOpenKeyset, adLockOptimistic, 0
Set Me.Recordset = rst.TestRecordset ' *bumm*


Das funktioniert aber:
Set Me.Recordset = rst.Clone
^^^^^

Bei Prüfung per VBA mit TypeOf wird ADODB.Recordset bestàtigt.
Ich kann MyRecordset auch ganz normal als ADODB.Recordset per VBA
verwenden. Nur an ein Formular/Listenfeld/... kann ich es nicht
zuweisen.

Könnte das Problem mit der DispId zusammenhàngen, die bei der
COM-Registrierung vergeben wird?
RegAsm meldet bei der Registrierung doppelte DISPID:
"Der Typbibliothekexporter hat beim Verarbeiten von
AdoTestLib.MyRecordset, AdoTestLib einen geringfügigen Fehler
gefunden. Warnung: Für den Typ wurde mindestens eine doppelte DISPID
angegeben."

Hat jemand eine Idee, was Access daran stört?
Access kann ja nicht wissen, dass ich ihm spàter etwas unterschieben
will. ;-)

mfg
Josef

P.S.:
Falls jemand nachdenkt, warum ich das mache:
Ich will aus einem .net-Assembly ein ADODB-Recordset an ein
bestehendes Access-FE weitergeben. Da ich aber im .net-Assembly nicht
mit ADODB arbeiten will, versuche ich über ado.net-Komponenten
(DataSet/DataTable/DataReader) und ADODB.Recordset-Schnittstelle dem
Access-FE ein (ungebundenes) adodb-Recordset vorzugaukeln, das aber
intern die .net-Komponenten verwendet.

[Fup' microsoft.public.de.access, da ich vermute, dass es mit Access
zusammenhàngt.]
 

Lesen sie die antworten

#1 Josef Poetzl
02/09/2007 - 13:05 | Warnen spam
Hallo!
Nachtrag:

Josef Poetzl schrieb:
[...]
Verwende ich nun diese Klasse, dann kracht es.
(Totalabsturz von Access)

Dim rst As ADODB.Recordset 'oder: AdoTestLib.MyRecordset
Set rst = New AdoTestLib.MyRecordset
rst.Open strSQL, cnn, adOpenKeyset, adLockOptimistic, 0

Set Me.Recordset = rst ' *bumm* ... aber richtig

Meldung:
"Access hat ein Problem festgestellt und muss beendet werden. ..."



Wenn ich das Recordset per Automation aus VB.net starte, dann kommt
die Fehlermeldung: "Die angegebene Umwandlung ist ungültig"

mfg
Josef

EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/

Ähnliche fragen