Ein Recordset aus mehren mdb

03/03/2008 - 16:18 von Wilfried Dietrich | Report spam
Hallo NG'ler,

ist es möglich ein einziges ADO-Recordset aus mehreren
MDB-Datenbanken zu bilden?

Es sind z.B. drei .mdb Dateien vorhanden die alle drei
eine Tabelle mit dem Namen "Artikel" enthalten.
Nun möchte ich ein ADO-Recordset erhalten, welches die
Datensàtze aus der Tabelle "Artikel" aller drei MDB's enthàlt.
Und das ganze noch mit einer Where-Klausel die sich nur auf
ein Schlüsselfeld bezieht.

Geht das, und wenn ja, wie?

Vielen Dank im voraus.
Gruß
Wilfried
 

Lesen sie die antworten

#1 Ralf Schrader
03/03/2008 - 17:41 | Warnen spam
Hallo Wilfried

Wilfried Dietrich schrieb

ist es möglich ein einziges ADO-Recordset aus mehreren
MDB-Datenbanken zu bilden?



Ja.

Es sind z.B. drei .mdb Dateien vorhanden die alle drei
eine Tabelle mit dem Namen "Artikel" enthalten.
Nun möchte ich ein ADO-Recordset erhalten, welches die
Datensàtze aus der Tabelle "Artikel" aller drei MDB's enthàlt.
Und das ganze noch mit einer Where-Klausel die sich nur auf
ein Schlüsselfeld bezieht.



1. Du liest sequentiell über 3 Connections die 3 Tabellen in 3 disconnected
Recordsets.
2. Du kopierst die Struktur eines der 3 Recordsets in ein viertes,
ungebundenes, z.B. mit

Private Function RSStructureCopy(ByRef Org As ADODB.Recordset, _
Optional ByVal ForceUpdatable As Boolean =
True) As ADODB.Recordset
Dim rs As ADODB.Recordset
Dim fld As ADODB.Field

Set rs = New ADODB.Recordset

For Each fld In Org.Fields
If ForceUpdatable And Not (fld.Attributes And adFldUpdatable) Then
rs.Fields.Append fld.Name, fld.Type, fld.DefinedSize,
adFldUpdatable + fld.Attributes
Else
rs.Fields.Append fld.Name, fld.Type, fld.DefinedSize,
fld.Attributes
End If
Next

Set RSStructureCopy = rs
Set rs = Nothing
End Function

zweckmàssigerweise hàngst Du noch ein Feld DataSource an, welches mit dem
entsprechenden Connectionparameter befüllt wird.

3. Dann kopierst Du die Values der 3 Primàrrecordsets wieder sequentiell ist
das 4. ungebundene. Ich habe dafür eine Routine, die aber von speziellen
Voraussetzungen ausgeht, welche ich immer einhalte. Aber als Anregung:

' rs*.fields(0) muss zwingend der Pk sein!

Private Sub RSAppend(ByRef rsDest As ADODB.Recordset, _
ByRef rsSource As ADODB.Recordset, _
Optional ByVal CheckFieldName As Boolean = True, _
Optional ByVal IdentityInsert As Boolean = False, _
Optional ByVal SourceOffset As Long = 0, _
Optional ByVal DestOffset As Long = 0)
Dim j As Long
Dim cmp As Boolean

With rsSource
If .RecordCount > 0 Then
.MoveFirst

Do Until .EOF
rsDest.AddNew

For j = 0 To .Fields.Count - 1
If j = 0 Then
If (rsDest.Fields(0).Type = adGUID) Then
rsDest.Fields(0).Value = m_win32.CreateOID '
extern Routine, erklàrt sich vom Namen her
ElseIf rsDest.Fields(0).Type = adInteger Or
IdentityInsert Then
rsDest.Fields(0).Value = .Fields(0).Value
End If
Else
If CheckFieldName Then
cmp = (rsDest.Fields(j + DestOffset).Name =
.Fields(j + SourceOffset).Name)
Else
cmp = True
End If

If cmp Then rsDest.Fields(j + DestOffset).Value =
.Fields(j + SourceOffset).Value
End If
Next

rsDest.Update ' redundant
.MoveNext
Loop
End If
End With

rsDest.MoveFirst
End Sub

Ralf

Ähnliche fragen