IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[VB.NET] Copie d'une table d'une DB vers une autre


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Profil pro
    csdcsdc
    Inscrit en
    Juin 2004
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : csdcsdc

    Informations forums :
    Inscription : Juin 2004
    Messages : 83
    Points : 65
    Points
    65
    Par défaut [VB.NET] Copie d'une table d'une DB vers une autre
    Bonjour,

    quelle est la solution la + simple et la + cohérente pour copier une table d'une base de donnée vers une autre ?

    PS :

    cas 1 : il y a + de colonnes dans la table cible
    cas 2 : les tables origine et cible sont identiques

    Merci pour toute suggestion

  2. #2
    Membre régulier
    Inscrit en
    Mai 2003
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 58
    Points : 70
    Points
    70
    Par défaut
    Salut,
    Si c'est entre des Formats différents:
    Un DataReader Pour récupèrer les données.
    Puis on boucle avec une Commande qui fait des INSERT dans la table Cible a chaque lecture.
    Si c'est sur les bases sont au meme format SQL Server ou Oracle il faut écrire toute la procédure en SQL.
    Il suffit alors d'appeler la procedure stockée, ce sera beaucoup plus rapide.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut Re: [VB.NET] Copy d'une table d'une DB vers une autre
    Citation Envoyé par SergeF
    cas 2 : les tables origine et cible sont identiques
    2 chaînes de connexions, 1 DataSet. Tu remplis le DataSet à partir de la première connexion, tu mets à jour dans la deuxième.

    Citation Envoyé par SergeF
    cas 1 : il y a + de colonnes dans la table cible
    Si les colonnes existantes sont identiques, c'est pareil. Sinon, si tu peux rendre la structre identique en jouant sur la requête de récupération des données, le reste est pareil aussi. Et sinon, faut une moulinette :)
    Be wary of strong drink.
    It can make you shoot at tax collectors, and miss.

  4. #4
    Membre régulier
    Inscrit en
    Mai 2003
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 58
    Points : 70
    Points
    70
    Par défaut
    Le Dataset c'est bien si les tables sont pas trop importantes...
    Pour une utilisation générale la moulinette sur le DataReader me semble plus sure....

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Citation Envoyé par bifidus
    Le Dataset c'est bien si les tables sont pas trop importantes...
    Pour une utilisation générale la moulinette sur le DataReader me semble plus sure....
    On a déjà couvert le sujet, mais à partir du moment où l'ensemble des données sont parcourues, il n'y a pas d'avantage du DataReader en termes de vitesse. Reste l'utilisation de la mémoire. S'il y a 2Go de données dans la table, c'est clair qu'il vaut mieux éviter, ou faire par petits bouts :)

    Bon après, selon le type de bases, il y a peut-être déjà des instructions toutes faites pour ce genre d'opérations (genre BULK INSERT dans SQL Server). Si c'est applicable, y aura ni plus simple, ni plus rapide :)

    Autre option, toujours pour SQL Server en source & destination : passer par un SELECT INTO (en faisant un serveur lié si la base de destination est sur une autre machine).
    Be wary of strong drink.
    It can make you shoot at tax collectors, and miss.

  6. #6
    Membre du Club
    Profil pro
    csdcsdc
    Inscrit en
    Juin 2004
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : csdcsdc

    Informations forums :
    Inscription : Juin 2004
    Messages : 83
    Points : 65
    Points
    65
    Par défaut Merci a tous
    Merci pour toutes les solutions.

    Et s'il s'agit d'une duplication de BDD complete, y a t il une solution particulière ?

    Faut il passer par un backup / restore ?

  7. #7
    Membre régulier
    Inscrit en
    Mai 2003
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 58
    Points : 70
    Points
    70
    Par défaut
    Pour la Duplication d'une db complète, c'est pas vraiment un problème de .NET a moins de vouloir réinventer la poudre!
    Il ne suffit pas de copier les tables: il y a les utilisateurs, les autorisations, les triggers etc...
    De toute facon ca va dépendre du format de la base de donnée...
    Pour SQL Server il y a la solution du Backup/Restore ou l'assistant de Transformation de données de Enterprise Manager qui permet d'importer tous les objets de la base et qui est trés souple.
    Pour MySQL ou Oracle je connais pas.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut Re: Merci a tous
    Citation Envoyé par SergeF
    Faut il passer par un backup / restore ?
    C'est encore le plus simple (si on excepte les embrouilles de droits avec des logins qui n'existent pas encore sur la base de destination). Sinon, toujours pour SQLServer, tu peux faire un package DTS pour ça, il y a une opération déjà toute faite pour les copies de BDDs. D'autres systèmes ont peut-être des équivalents.

    Dans tous les cas, je rejoins bifidus, c'est pas du ressort de .NET. À moins de vouloir développer un remplacement d'Enterprise Manager en .NET :)
    Be wary of strong drink.
    It can make you shoot at tax collectors, and miss.

  9. #9
    Membre du Club
    Profil pro
    csdcsdc
    Inscrit en
    Juin 2004
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : csdcsdc

    Informations forums :
    Inscription : Juin 2004
    Messages : 83
    Points : 65
    Points
    65
    Par défaut Une solution (parmi d'autres)
    Oui, effectivement, je n'avais pas pensé a DTS ... :-(

    Pour ceux que ca interesse, une solution en VB.NET qui copie le contenu de toutes tables de la BDD d'origine vers le BDD destination. Les structures de tables sont considérées comme identiques (mais ca marche aussi si les tables destinations ont + de colones).

    Si il y a des commentaires sur le codage ou l'utilisation plus ou moins appropriée des objets .net, je suis preneur.

    Salut a tous.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
     
        Public Function CopyTableDataV1p1(ByVal sFromConnection As String, ByVal sToConnection As String) As Boolean
     
            Dim sctSchemaTableTABLES As DataTable
            Dim ocmMyFromOleDBCommand As New OleDb.OleDbCommand
            Dim drMyFromOleDataReader As OleDb.OleDbDataReader
            Dim iTables As Integer
            Dim sFromCommand As String
            Dim arColumns As New ArrayList
            Dim arColumnTypes As New ArrayList
            Dim sctSchemaTableCOLUMNS As DataTable
            Dim myRow As DataRow
            Dim myCol As DataColumn
            Dim ocmMyToOleDBCommand As New OleDb.OleDbCommand
            Dim drMyToOleDataReader As OleDb.OleDbDataReader
            Dim sToCommand As String
            Dim sToCommandFinal As String
            Dim iColumns As Integer
     
            'ouverture base de donnée source
            Try
                myFromOleBDConnexion.ConnectionString = sFromConnection
                myFromOleBDConnexion.Open()
            Catch ex As OleDb.OleDbException
                MessageBox.Show&#40;"Erreur d'ouverture Base de Donnée source. Erreur &#58; <" & ex.Message & ">" & vbCrLf & sFromConnection.ToString, "CopyTableDataV1p1", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning&#41;
                CopyTableDataV1p1 = False
                GoTo ExitFunction
            End Try
     
            'ouverture base de donnée cible
            Try
                myToOleBDConnexion.ConnectionString = sToConnection
                myToOleBDConnexion.Open&#40;&#41;
            Catch ex As OleDb.OleDbException
                MessageBox.Show&#40;"Erreur d'ouverture Base de Donnée cible. Erreur &#58; <" & ex.Message & ">" & vbCrLf & sToConnection.ToString, "CopyTableDataV1p1", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning&#41;
                CopyTableDataV1p1 = False
                GoTo ExitFunction
            End Try
     
            'récupération du schéma BDD &#40;liste des tables&#41;
            sctSchemaTableTABLES = myFromOleBDConnexion.GetOleDbSchemaTable&#40;OleDb.OleDbSchemaGuid.Tables, New Object&#40;&#41; &#123;Nothing, Nothing, Nothing, "TABLE"&#125;&#41;
     
            'pour chaque table
            Try
                For iTables = 0 To sctSchemaTableTABLES.Rows.Count - 1
                    With sctSchemaTableTABLES.Rows&#40;iTables&#41;
                        'ouverture de la table et du datareader
                        sFromCommand = "SELECT * FROM " & .Item&#40;2&#41;
                        With ocmMyFromOleDBCommand
                            .Connection = myFromOleBDConnexion
                            .CommandType = CommandType.Text
                            .CommandText = sFromCommand
                            drMyFromOleDataReader = .ExecuteReader&#40;&#41;
                        End With
     
                        'récupération du schéma de la table
                        sctSchemaTableCOLUMNS = drMyFromOleDataReader.GetSchemaTable&#40;&#41;
                        arColumns.Clear&#40;&#41;
                        arColumnTypes.Clear&#40;&#41;
                        For Each myRow In sctSchemaTableCOLUMNS.Rows
                            arColumns.Add&#40;myRow&#40;0&#41;.ToString&#41;
                            arColumnTypes.Add&#40;myRow&#40;5&#41;.ToString.ToLower&#41;
                        Next
     
                        'construire le SQL INSERT
                        sToCommand = "INSERT INTO " & .Item&#40;2&#41; & " &#40;"
     
                        'pour chaque colonne les noms de colonnes
                        For iColumns = 0 To arColumns.Count - 1
                            sToCommand &= arColumns&#40;iColumns&#41;.ToString & ", "
                        Next iColumns
                        sToCommand = sToCommand.Substring&#40;0, sToCommand.Length - 2&#41; & "&#41; VALUES &#40;"
     
                        'copie des données
                        Do While drMyFromOleDataReader.Read
                            sToCommandFinal = sToCommand
     
                            'pour chaque colonne les data
                            For iColumns = 0 To arColumns.Count - 1
                                Select Case arColumnTypes&#40;iColumns&#41;.ToString
                                    Case "system.int32"
                                        sToCommandFinal &= IIf&#40;IsDBNull&#40;drMyFromOleDataReader.Item&#40;iColumns&#41;&#41;, "NULL", drMyFromOleDataReader.Item&#40;iColumns&#41;.ToString&#41; & ", "
                                    Case "system.string"
                                        sToCommandFinal &= IIf&#40;IsDBNull&#40;drMyFromOleDataReader.Item&#40;iColumns&#41;&#41;, "NULL", "'" & drMyFromOleDataReader.Item&#40;iColumns&#41;.ToString&#41; & "', "
                                    Case "system.datetime"
                                        sToCommandFinal &= IIf&#40;IsDBNull&#40;drMyFromOleDataReader.Item&#40;iColumns&#41;&#41;, "NULL", "'" & Format&#40;CDate&#40;drMyFromOleDataReader.Item&#40;iColumns&#41;.ToString&#41;, "MM/dd/yyyy hh&#58;mm&#58;ss"&#41;&#41; & "', "
                                    Case "system.double"
                                        sToCommandFinal &= IIf&#40;IsDBNull&#40;drMyFromOleDataReader.Item&#40;iColumns&#41;&#41;, "NULL", drMyFromOleDataReader.Item&#40;iColumns&#41;.ToString.Replace&#40;",", "."&#41;&#41; & ", "
                                    Case Else 'pour d'autres types
                                End Select
                            Next iColumns
                            sToCommandFinal = sToCommandFinal.Substring&#40;0, sToCommandFinal.Length - 2&#41; & "&#41;"
     
                            'utiliser le SQL INSERT
                            With ocmMyToOleDBCommand
                                .Connection = myToOleBDConnexion
                                .CommandType = CommandType.Text
                                .CommandText = sToCommandFinal
                                drMyFromOleDataReader = .ExecuteReader&#40;&#41;
                            End With
                            drMyToOleDataReader.Close&#40;&#41;
                        Loop
     
                        'fin de lecture de la table
                        drMyFromOleDataReader.Close&#40;&#41;
                    End With
                Next
            Catch ex As OleDb.OleDbException
                MessageBox.Show&#40;"Erreur pendant opération de copie. Erreur &#58; <" & ex.Message & ">" & vbCrLf & sToConnection.ToString, "CopyTableDataV1p1", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning&#41;
                CopyTableDataV1p1 = False
                GoTo ExitFunction
            End Try
     
            CopyTableDataV1p1 = True
     
    ExitFunction&#58;
     
            'fermeture base de donnée source
            If Not myFromOleBDConnexion Is Nothing Then
                Try
                    myFromOleBDConnexion.Close&#40;&#41;
                Catch ex As Exception
                    MessageBox.Show&#40;"Erreur de fermeture Base de Donnée source. Erreur &#58; <" & ex.Message & ">", "CopyTableDataV1p1", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning&#41;
                    CopyTableDataV1p1 = False
                End Try
            End If
     
            'fermeture base de donnée cible
            If Not myToOleBDConnexion Is Nothing Then
                Try
                    myToOleBDConnexion.Close&#40;&#41;
                Catch ex As Exception
                    MessageBox.Show&#40;"Erreur de fermeture Base de Donnée cible. Erreur &#58; <" & ex.Message & ">", "CopyTableDataV1p1", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning&#41;
                    CopyTableDataV1p1 = False
                End Try
            End If
     
        End Function

  10. #10
    Membre régulier
    Inscrit en
    Mai 2003
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 58
    Points : 70
    Points
    70
    Par défaut
    Ou la la, c'est pas trés Objet ton code !
    ca fait un peu VB6...
    Si tu as besoin de copier une seule Table vers une autre tu va être obligé de faire de l'héritage par Copier Coller...
    VB6 = Function CopyTables(ConDep, ConDest)
    VB.NET= (je donne juste un exemple de structure)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Class dbClass 'ta classe de base de donnée qui encapsule des Objets OleDb qui ne sont pas héritables
     
    Dim Con as OleDbConnection
    Dim Tb&#40;&#41; as TbClass
     
    Sub New&#40;con as OledbConnection&#41;
     me.Con = con
    End Sub
     
    Public Sub CopyTo&#40;db as dbClass&#41;
      Dim Tble as New TbClass
      For each Tble in me.Tb
        Dim TbDest as new TbClass
        db.Tb.add&#40;TbDest&#41;    
        Tble.CopyTo&#40;TbDest&#41;
      Next
    End sub
    End Class
     
    Public Class TbClass 'Ta classe de Table
     
      Dim Tb as DataTable
     
      Public Sub CopyTo&#40;Tb as TbClass&#41;
      End sub
     
    End Class
    Aprés on peut gérer les erreurs, rajouter une détection des formats de Base pour faire du SQL spécifique et avoir un vrai composant de gestion de Bases réutilisable !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/03/2011, 12h22
  2. Réponses: 2
    Dernier message: 17/01/2010, 19h09
  3. Réponses: 3
    Dernier message: 15/10/2008, 10h24
  4. Probleme d'update d'une table dans un DataGridView vers une bd
    Par Faladin dans le forum Windows Forms
    Réponses: 3
    Dernier message: 22/05/2008, 21h12
  5. Réponses: 3
    Dernier message: 06/10/2007, 13h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo