2010-04-19 3 views
2

J'ai deux bases de données identiques avec la même structure, la base de données a dans l'ordinateur a et la base de données b dans l'ordinateur b.Comment fusionner des données provenant de deux bases de données d'accès 2007 distinctes

Les données de la base de données a **** (a.accdb) **** et de la base de données b **** (b.accdb) **** sont différentes. alors dans la base de données ai par exemple ID: 1, 2, 3 et dans la base de données B i have ID: 4,5,6

Ensuite, j'ai besoin de fusionner ces données de bases de données dans une seule base de données (a ou b, ne pas question) de sorte que la base de données finale ressemble. ID: 1,2,3,4,5,6

Je recherche un moyen facile de le faire. parce que j'ai beaucoup de tables. et le faire par requête d'union est si fastidieux.

Je recherche par exemple pour une option de sauvegarde pour les données uniquement sans système, comme dans de nombreux Postgresql ou SGBDR d'autres, mais je ne vois pas cette option en matière d'accès 2007.

pd: juste la table pourrait être des valeurs en double valeurs (je suppose que pk ne permet pas de copier une valeur en double et toutes les autres valeurs seront bien copiées). Si je me trompe, corrigez-moi s'il vous plaît.

merci pour votre aide.

+0

il n'y a pas autonumeric .. la clé primaire est Compose dans un champ de texte ID (non NuméroAuto) et un champ de date. presque toutes les tables ont cette combinaison de pk. -> d'autre part j'ai une table avec les clients .. le client a comme clé primaire son numéro d'identification. alors il est possible d'avoir un client dans la base de données a et le même client dans la base de données b. mais avec presque toutes les tables ce problème n'est pas présent et registre sont différents dans chaque base de données ----------- alors il n'y a pas de problème si dans cette table unique les données ne sont pas copiées. pour cette seule table je peux copier et coller les valeurs manuellement. – MaK

Répondre

3

Si vous avez une table, tblFoo, avec la même structure dans les deux bases de données, vous pouvez essayer d'ajouter le contenu d'une table dans l'autre. Donc, avec a.accdb ouvert:

INSERT INTO tblFoo 
SELECT * 
FROM tblFoo IN 'C:\YourPath\b.accdb'; 

En fait, je suis sceptique cette approche fonctionnera pour vous parce que vous avez mentionné les clés primaires et les doublons. Peut-être auriez-vous plus de chance d'ajouter le contenu des deux copies de tblFoo dans une troisième table, tblFooMaster, qui n'a pas de clé primaire ou de contraintes uniques. Dans cette situation, vous devrez déterminer ce que vous voulez faire avec les doublons dans tblFooMaster. J'espère que vous disposez de sauvegardes des deux bases de données avant d'essayer toute forme de consolidation.

Édition: Si cette méthode est satisfaisante, vous n'avez pas besoin de créer une requête pour chaque table. Utilisez VBA pour générer et exécuter la requête pour vous.

Public Sub ImportTableData(ByVal pstrTable As String, _ 
     ByVal pstrDb As String) 

    Dim strSql As String 
    strSql = "INSERT INTO " & pstrTable & vbNewLine & _ 
     "SELECT *" & vbNewLine & _ 
     "FROM " & pstrTable & " IN '" & pstrDb & "';" 
    'caller will handle errors ' 
    CurrentDb.Execute strSql, dbFailOnError 
End Sub 

Étant donné que votre préférence est de faire les transferts de table comme une seule opération, vous pouvez une autre procédure VBA nourrir vos noms de table à la procédure ImportTableData.

Public Sub ImportAllTables() 
    Const cstrDb As String = "C:\YourPath\b.accdb" 
    Dim tdf As TableDef 
    Dim strMsg As String 

On Error GoTo ErrorHandler 

    For Each tdf In CurrentDb.TableDefs 
     'ignore system and temporary tables ' 
     If Not (tdf.Name Like "MSys*" Or _ 
       tdf.Name Like "~*") Then 
      Call ImportTableData(tdf.Name, cstrDb) 
     End If 
    Next tdf 

ExitHere: 
    On Error GoTo 0 
    Set tdf = Nothing 
    Exit Sub 

ErrorHandler: 
    Select Case Err.Number 
    Case 3078 
     strMsg = "Input table " & tdf.Name & " not found." 
     MsgBox strMsg 
     Resume Next 
    Case Else 
     strMsg = "Error " & Err.Number & " (" & Err.Description _ 
      & ") in procedure ImportAllTables" 
     MsgBox strMsg 
     GoTo ExitHere 
    End Select 
End Sub 
+0

cela fonctionne, seulement je pense qu'il existe une méthode plus facile que dans d'autres bases de données, exporter toutes les données de base de données ou quelque chose de similaire. ------ Maintenant, je dois répondre à toutes mes questions. Je te réponds encore. comment puis-je exécuter les 35 requêtes en une seule méthode ??? pas seulement une requête à chaque fois. merci beaucoup – MaK

+0

merci beaucoup, c'est que j'ai besoin. :) Une dernière question, il y a un moyen d'appeler cette vba de C# .NET? ou j'ai besoin de ma propre méthode en C# pour cela? – MaK

+0

@Diego Peut-être poser une autre question sur la façon d'exécuter une procédure VBA dans une base de données Access en utilisant C#. Je ne peux pas vous aider, mais je soupçonne que d'autres ont déjà fait ce chemin. – HansUp

Questions connexes