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

VB.NET Discussion :

Copier résultat requête dans une autre database


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Homme Profil pro
    Consultant technique
    Inscrit en
    Août 2019
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant technique

    Informations forums :
    Inscription : Août 2019
    Messages : 22
    Points : 16
    Points
    16
    Par défaut Copier résultat requête dans une autre database
    Bonjour,

    Je me tourne vers vous car je trouve pas ou comprend pas bien, comment je peux transférer des données d'une table microsoft SQL vers une database access mdb.
    j'utilise visual studio code 2019 en vb.net.

    J'ai une base de donnée Microsoft SQL pour lesquels j'exécute une requête SQL qui me permet de récupérer des données.

    Dans un deuxiéme temps j'ai besoin de copier ses données dans une autres database access en mdb. Ce fichier contient des infos a un instant T, mais j'ai besoin de lui rajouter les tables préalablement récupérer de ma base SQL.
    Pour l'instant je fais une boucle et j'exécute des requête SQL (INSERT INTO) ligne a ligne.
    Je suis pas bien certain d'avoir la meilleur méthode.
    Je dois pas me tromper sur l'ordre et la définition du type de colonne lors de la création de la table.
    En plus c'est lent comme process.

    détails des étapes :
    - Select * FROM [Material] (base SQL)

    - CREATE TABLE [CxMaterial] (fichier mdb)
    - INSERT Into [CxMaterial] VALUES ( x fois selon le résultat de la requête select)

    et je répéte cette opération sur trois autres tables a copier.

    Pouvez vous m'aider a améliorer mon process ?

    merci d'avance a vous

  2. #2
    Membre éprouvé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 691
    Points : 996
    Points
    996
    Par défaut
    Bonjour

    J'avoue fuir Access (j'ai de très mauvais souvenirs de cette base en production, même si c'était il y a longtemps).
    Mais normalement, tu devrais plutôt faire un INSERT INTO NomDeLaTableDestination (ListeDesChampsDeLaTableDestination) SELECT ListeDesChampsDeLaTableOrigine From NomDeLaTableOrigine
    Sauf que l'on est sur 2 bases différentes donc çà passera pas.

    Edit :
    Ne pourrais tu pas utiliser une solution comme celle-ci ?

  3. #3
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonjour,

    Le mieux (à mon avis) est que les tables cibles soient préalablement créées dans la DB cible. Si cela ne peut être fait manuellement, il faut écrire les codes qui analysent la DB source et créent les tables dans la DB cible.

    Ensuite, il suffit de lire dans (SELECT) la source les enregistrements à copier (ou tous) et les ajouter (INSERT) dans la DB cible.

    Voici le code d'une procédure qui copie les enregistrements d'une DB Access vers une DB SqlExpress (les mots du programmeur sont en espagnol, mais je peux explique s'il le faut). Ce code fonctionne très rapidement et pourtant, il peut être amélioré. :
    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
     
        Private Sub CopiarTablaAccessEnSQLExpress()
            Dim ComandoSQL As String = ""
            Dim ConsultaSQL As String = ""
            Dim MiComando As New SqlCommand
     
            Dim MiDataTabla As New DataTable
     
            ConexionSQLExpress.ConnectionString = CadenaConexionParaSQLExpress
            ConexionSQLExpress.Open()
            ConexionAccess1.ConnectionString = CadenaConexionParaAccess1
            'ConexionAccess1.Open()
     
            ConsultaSQL = "SELECT Id_Expediente, FechaRgto, Id_Usuario, Motivo, Explica, Open_Close FROM Hist_Expte"
     
            Dim MiAdapter As OleDbDataAdapter = New OleDbDataAdapter(ConsultaSQL, ConexionAccess1)
            MiAdapter.Fill(MiDataTabla)
     
            ComandoSQL = "INSERT INTO Hist_Expte (Id_Expediente, FechaRgto, Id_Usuario, Motivo, Explica, Open_Close) VALUES (@param1, @param2, @param3,@param4, @param5, @param6)"
     
            MiComando.Connection = ConexionSQLExpress
            MiComando.CommandType = CommandType.Text
            MiComando.CommandText = ComandoSQL
     
            For I As Integer = 0 To MiDataTabla.Rows.Count - 1
     
                MiComando.Parameters.AddWithValue("@param1", MiDataTabla.Rows(I).Item(0))
                MiComando.Parameters.AddWithValue("@param2", MiDataTabla.Rows(I).Item(1))
                MiComando.Parameters.AddWithValue("@param3", MiDataTabla.Rows(I).Item(2))
                MiComando.Parameters.AddWithValue("@param4", MiDataTabla.Rows(I).Item(3))
                MiComando.Parameters.AddWithValue("@param5", MiDataTabla.Rows(I).Item(4))
                MiComando.Parameters.AddWithValue("@param6", MiDataTabla.Rows(I).Item(5))
     
                MiComando.ExecuteNonQuery()
                MiComando.Parameters.Clear()
     
            Next
     
            MiAdapter.Dispose()
            MiComando.Dispose()
            ConexionSQLExpress.Close()
            ConexionSQLExpress.Dispose()
     
            ConexionAccess1.Dispose()
            '        MessageBox.Show("Registros copiados")
     
        End Sub
    J'espère que ceci t'aidera ...

  4. #4
    Membre à l'essai
    Homme Profil pro
    Consultant technique
    Inscrit en
    Août 2019
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant technique

    Informations forums :
    Inscription : Août 2019
    Messages : 22
    Points : 16
    Points
    16
    Par défaut
    L'exemple semble pas mal identique a ceux que je fait.
    vidéo pour exemple de vitesse : Chaque tiré correspond a un insert into dans ma base access.

    http://sc.com.ly/show/Fvwpy8eRl1sSox7t0cHbrgO9fP3BIYkA

    j'ai anonymisé mon code et épuré pour l'exemple

    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
     
     
    Public sub main()
     
    	Dim ReportMDB As New AccessControl
    		ReportMDB.AccessFile(Outputfile)
     
     
    	Dim MaterialDatabase As New SQLControl		
    	MaterialDatabase.ExecQuery("Select * FROM [Material] Where [ID] In (" & MatId_List & ")")  'liste préalablement récupéré avec une requête
     
     
    	ReportMDB.ExecQuery("CREATE TABLE [CxMaterial] (ID Int ,ParentID int ,Name VARCHAR(100)")
     
    	For Each r In MaterialDatabase.DBDT.Rows
     
    		ReportMDB.ExecQuery("INSERT Into [CxMaterial] VALUES (1,1,""texte""")
     
    	Next
    End Sub
     
    Public Class AccessControl
    	Private objConnection As OleDbConnection = New OleDbConnection 
     
    	    ' DB DATA
        Public DBDA As OleDbDataAdapter
        Public DBDT As DataTable
     
        ' QUERY PARAMETERS
        Public Params As New List(Of OleDbParameter)
     
        ' QUERY STATISTICS
        Public RecordCount As Integer
     
        Public Exception As String
     
    	    Public Sub AccessFile(file As String)
            'objConnection.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & file & ";"
            objConnection.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & file & ";"
        End Sub
     
    	Public Sub ExecQuery(Query As String, Optional QueryDebug As Boolean = False)
            RecordCount = 0
            Exception = ""
     
            If QueryDebug Then MsgBox(Query)
     
            If Not IsNothing(DBDT) Then DBDT.Clear()
     
            Try
                DBCmd = New OleDbCommand(Query)
     
                DBCmd.Connection() = objConnection
     
                ' LOAD PARAMS INTO DB COMMAND
                Params.ForEach(Sub(p) DBCmd.Parameters.Add(p))
     
                ' CLEAR PARAM LIST
                Params.Clear()
     
                ' EXECUTE COMMAND & FILL DATASET
                DBDT = New DataTable
                DBDA = New OleDbDataAdapter(DBCmd)
                RecordCount = DBDA.Fill(DBDT)
     
            Catch ex As Exception
     
                Exception = "ExecQuery Error: " & vbNewLine & ex.Message
            Finally
                ' CLOSE CONNECTION
            End Try
        End Sub
     
    End class

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    pour de la simplicité et de la rapidité le mieux reste de passer par un serveur lié
    sql server offre la possibilité de créer un serveur lié, soit un lien vers une autre base de données (plusieurs types sont supportés)
    une fois le serveur lié créé (un nom, et comment y accéder) vers access il est ensuite possible de faire depuis sql server (et donc depuis c# connecté à sql server aussi) :

    insert into labaseaccess.nomtable (les colonnes) select ... from ...

    le traitement par lot est inifiniment plus rapide que ligne par ligne, à fortiori quand ca passe par du code c# comme intermédiaire

    sql server a une instruction select into qui créé automatiquement la table si elle n'existe pas, je ne sais pas si ca fonctionnera via le serveur lié (tout n'est pas supporté)
    mais auquel ca serait
    select ... into labaseaccess.nomtable from ...

    sinon il est aussi possible de générer un script de create table à la volée en fonction des types dans sql server, avec un peu de code
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 420
    Points : 2 179
    Points
    2 179
    Par défaut
    bonjour,
    tu fais un connexion sur ACCESS et dans ta requête une liaison externe sur Sql Serveur!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Sql = "Select *  INTO  [NewTableAcces] from [ODBC;Driver={SQL Server};SERVER=" & MyServeur & ";DATABASE=" & MyDATABASE & ";UID=" & MyUID & ";Pwd=" & MyPwd & "].[TableSqlServer]"

  7. #7
    Membre à l'essai
    Homme Profil pro
    Consultant technique
    Inscrit en
    Août 2019
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant technique

    Informations forums :
    Inscription : Août 2019
    Messages : 22
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    pour de la simplicité et de la rapidité le mieux reste de passer par un serveur lié.....
    Je ne connait pas du tous les serveur lié, je vais regarder comment ca fonctionne. J'ai deux contraintes je ne peux pas trop administrer la base SQL comme je veux, faut que cela sois simple a répliquer sur plusieurs client, et je n'ai que les droits en lecture, une fois chez les clients.
    Pour la base access elle aussi n'est pas créé par moi.

    Citation Envoyé par Thumb down Voir le message
    bonjour,
    tu fais un connexion sur ACCESS et dans ta requête une liaison externe sur Sql Serveur!
    je vais tenter ca, a première vue c'est plus simple.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Consultant technique
    Inscrit en
    Août 2019
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant technique

    Informations forums :
    Inscription : Août 2019
    Messages : 22
    Points : 16
    Points
    16
    Par défaut
    Ya pas de doute la méthode de Thumb down et bien plus efficace que la méthode que j'avais.
    En rapidité rien a voir.
    En simplicité de code aussi. Pas besoin de ce faire ... a bien créer la table avec les bon type de colonne.

    Enfin je viens juste de remarquer en faisant la suite de mon code que sur Access mes colonnes en INT deviennent du texte. Donc ma requête qui suit ne peux pas faire les jointures "Incohérence de type de donnée"

  9. #9
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 420
    Points : 2 179
    Points
    2 179
    Par défaut
    Bonjour,
    Vérifies s'il ne faut pas caster les données SQL SERVEUR pour les rendre compatible avec ACCESS!

  10. #10
    Membre à l'essai
    Homme Profil pro
    Consultant technique
    Inscrit en
    Août 2019
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant technique

    Informations forums :
    Inscription : Août 2019
    Messages : 22
    Points : 16
    Points
    16
    Par défaut
    Je viens de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select Cint(ID) as ID, Name  Into  [NewTableAcces] from [ODBC;Driver={SQL Server};SERVER=" & MyServeur & ";DATABASE=" & MyDATABASE & ";UID=" & MyUID & ";Pwd=" & MyPwd & "].[TableSqlServer]"
    tous est fonctionnelle merci a vous.

  11. #11
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 420
    Points : 2 179
    Points
    2 179
    Par défaut
    À ton service.

    Même en utilisant le processus Import/Exporter SQL serveur/Access on peut avoir des surprises !

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

Discussions similaires

  1. Utiliser le résultat d'une requête dans une autre requête
    Par ju1571 dans le forum Développement
    Réponses: 4
    Dernier message: 04/08/2015, 19h38
  2. Réponses: 17
    Dernier message: 10/05/2013, 11h14
  3. Insérer le résultat d'une requête dans une autre table
    Par kroma23 dans le forum Bases de données
    Réponses: 1
    Dernier message: 15/02/2011, 15h13
  4. [MySQL] Afficher le résultat d'une requête dans une autre page
    Par mohamed2006 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 29/02/2008, 21h02
  5. Réponses: 4
    Dernier message: 13/11/2007, 22h23

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