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

Projets ADP Discussion :

Transférer les données Access vers des tables SQL server avec une colonne compteur identité [AC-2010]


Sujet :

Projets ADP

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2010
    Messages : 252
    Points : 145
    Points
    145
    Par défaut Transférer les données Access vers des tables SQL server avec une colonne compteur identité
    Bonjour,

    je ne savais pas trop exactement dans quel sous-forum placer ma question alors n'hésitez pas à la déplacer si vous trouvez mieux!

    Je suis en train de convertir une base de données Access 2010 (.accdb) en base SQL server.
    J'ai utilisé les fonctionnalités intégrées d'Access pour créer automatiquement mes tables (il n'y en a qu'une quinzaine) dans SQL server et ai modifié le type de quelques colonnes sans compromettre la compatibilité avec la structure Access d'origine.

    J'ai ensuite travaillé sur le frontal de l'application, une autre base Access mais 2016, pour adapter différents traitement VBA ou autres.

    Mon problème est que pendant ce temps la base de données initiale est toujours en service et s'enrichit d'heure en heure; je vais donc devoir supprimer toutes les données SQL que j'ai récupérées au départ pour réinjecter les données actuelles lorsque je serai prêt à faire la bascule et j'aurai relativement peu de temps.

    Ce qui m'embête, bien sûr, ce sont les colonnes compteurs assorties en général d'une contrainte primaryKey ; Je pense que je vais devoir recourir à un BulkCopy mais ayant très rarement utilisé cette fonctionnalité, j'apprécierais de recevoir vos conseils voir un exemple s'il s'en trouvait un.

    Merci d'avoir lu ma requête jusqu'au bout!

  2. #2
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 876
    Points : 4 751
    Points
    4 751
    Par défaut
    Bonjour,

    Ceci devrait t'aider https://www.developpez.net/forums/d2...uite-compteur/

    Donc, dans Sql Server, n’activer l'autoincrementation qu'après l'import des données

    CDLT
    "Always look at the bright side of life." Monty Python.

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2010
    Messages : 252
    Points : 145
    Points
    145
    Par défaut
    Merci pour ta réponse rapide micniv, mais encore une fois je n'ai pas dû être très claire dans mes explications.

    Lorsque j'ai fait la migration les tables SQL ont automatiquement repris les colonnes compteurs qui étaient définies dans Access et les données du moment ont été intégrées.

    Je parlais d'utiliser BulkCopy, j'aurais dû vérifier la syntaxe car il s'agit en fait de BULK INSERT, pour injecter les nouvelles données en me demandant s'il y avait une possibilité pour conserver simplement les valeurs des colonnes compteur d'Access; Après un peu de lecture à la sauce Microsoft je vois que le paramètre "KEEPIDENTITY" de cette commande doit résoudre mon problème.

    Au delà de cette question, et d'une manière plus générale, ayant quelques craintes quant au jeu de caractères et au format des lignes entre Access et SQL, je demandais si quelqu'un ayant réalisé une opération de cette nature avait quelques conseils voire un exemple à me suggérer.

    Bon, je tente ça dès demain matin, je reviendrai ici pour vous indiquer les problèmes que j'aurai rencontré et les solutions fournies.

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2010
    Messages : 252
    Points : 145
    Points
    145
    Par défaut
    [/LIST]
    Voilà, je reviens avec des réponses pour ceux que ça peut intéresser.

    J'ai fait ma migration et je vais vous faire part des problèmes que j'ai rencontré et des solutions que j'y ai apportées.

    Mode opératoire:
    Dans Access j'ai utilisé l'outil de transfert d'une base de données vers SQL serveur en ne transférant que la structure des tables. Je n'ai transféré que les tables car les requêtes, dans un premier temps, restent dans Access.

    S'il en existe j'ai remplacé le type des champs Monétaires par un type décimal ou réel car lors de l'exportation Access inscrit le symbole de la monnaie avec la valeur ce qui ne passe pas du côté SQL Serveur.

    Ensuite j'ai écrit une petite procédure pour exporter chaque table dans un fichier csv que j'ouvre aussitôt pour y substituer certains caractères inappropriés car Access ne permet pas de spécifier finement le format sauf à créer un modèle pour chaque table (j'en avais 47!):
    • Suppression des guillemets délimitant les chaines de texte
    • Suppression des retours chariot fin de ligne dans les chaines de texte
    • Remplacement des caractères spéciaux non reconnus par SQL - mais ça devrait pouvoir se résoudre en jouant sur le paramètre de page de code côté SQL - ici le "°" de "n°"
    • Remplacement des "," par le tube ("|") pour permettre d'avoir des virgules dans les textes.


    Voici le code de ce traitement VBA:
    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
     
    '	===========================================================================================
    Sub exporterTables()
    '	===========================================================================================
    Dim NomTable As String
    Dim Dossier As String
    Dim i As Integer
     
    Dossier = "C:\Données\"
     
    For i = 1 To 5
    	NomTable = Choose(i, "Table1", "Table2", "Table3", "Table4", "Table5")
       Debug.Print "Exportation de " & NomTable
       If Not exporteUneTable(Dossier, NomTable) Then
          Stop
       End If
    Next i
    DoCmd.Echo True, ""
    MsgBox "Exportations terminées"
     
    End Sub
     
    '	===========================================================================================
    Function exporteUneTable(ByVal Dossier As String, ByVal NomTable As String) As Boolean
    '	===========================================================================================
    Dim Txt As String
    Dim i As Integer
    Dim NomFichier As String
     
    Dim Fs As New FileSystemObject
    Dim Ts As TextStream
    Dim Ts2 As TextStream
    Dim NomFichier2 As String
    Dim n As Integer
    Dim m As Integer
    Dim Phrase As String
    Dim ligne As String
     
    Const CR As String = "¤"
     
       DoCmd.Echo True, " Traiement de la table " & NomTable & "..."
     
       NomFichier = Dossier & "_" & NomTable & ".txt"
       NomFichier2 = Dossier & NomTable & ".txt"
     
       DoCmd.TransferText acExportDelim, , NomTable, NomFichier, False
     
       Set Ts = Fs.OpenTextFile(NomFichier, ForReading)
       Set Ts2 = Fs.OpenTextFile(NomFichier2, ForWriting, True)
       Do Until Ts.AtEndOfStream
          Txt = Ts.ReadLine '  Lit la ligne suivante
          If InStr(Txt, CR) > 0 Then
             Stop
          End If
          n = InStr(Txt, """")
          Do While n > 0
             m = InStr(n + 1, Txt, """")
             If m = 0 Then
                Txt = Txt & " " & Ts.ReadLine '  Ajoute la ligne suivante sans CRLF
                m = InStr(n + 1, Txt, """")
                If m = 0 Then
                   Stop
                End If
             End If
             Phrase = Mid(Txt, n + 1, m - n - 1)
             Phrase = Replace(Phrase, ",", CR)
             Phrase = Replace(Phrase, "°", " ")
             Txt = Left(Txt, n - 1) & Phrase & Mid(Txt, m + 1)
             n = InStr(Txt, """")
          Loop
     
          '   remplace les virgules par des tubes
          Txt = Replace(Txt, ",", "|")
          '  remplace les doubles tubes par des virgules
          Txt = Replace(Txt, CR, ",")
          '   ecrit la ligne convertie
          Ts2.WriteLine Txt
     
       Loop
       '  Ferme les fichiers
       Ts.Close
       Ts2.Close
     
    DoCmd.Echo True, ""
    exporteUneTable = True
     
    End Function
    Du côté du serveur SQL j'ai écrit un petit script sous Transact SQL pour intégrer les fichiers textes dans les tables correspondantes en utilisant la commande SQL BULK INSERT:

    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
     
    -- importation des fichiers textes
    declare @Dossier nvarchar(50) = 'C:\Données\';
    declare @Table nvarchar(500);
    declare @Fichier nvarchar(200);
    declare @Txt nvarchar(500);
    declare @Msg nvarchar(100);
     
    declare @Tmp table(Ordre int, Tables nvarchar(50));
    -- ici on utilise une suite d'instructions insert values pour ajouter le nom de chaque table à importer dans la table @Tmp
    insert into @Tmp (Ordre, Tables) values (1, N'Table1');
    ...
     
    begin try
     
    	declare Tmp cursor for 
    		select Tables from @Tmp order by Ordre;
    	open tmp;
    	Fetch next from Tmp into @Table;
    	while @@fetch_status = 0
    		begin
    			set @Fichier = @Dossier + @Table + N'.txt';
    			set @Txt=N'BULK INSERT tracosDataSQL.dbo.' + @Table + N'
    			from ''' + @Fichier + N'''
    			with (FIELDTERMINATOR =''|'', KEEPIDENTITY , KEEPNULLS);'
     
    			set @Msg = N'Importation de la table ' +  @Table;
    			print @Msg;
    			execute (@txt);
     
    			Fetch next from Tmp into @Table;
    		end
    	close Tmp;
    	deallocate Tmp;
     
    	Print N'Importations terminées';
    end try
     
    begin Catch
    	set @Msg = N'Echeque sur la table ' +  @Table;
    	print @Msg;
    end catch

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

Discussions similaires

  1. Exporter Base de données Access vers un fichier .sql
    Par johnpelu dans le forum Access
    Réponses: 2
    Dernier message: 16/04/2014, 14h46
  2. [AC-2007] Comment lier une partie d'une Table Sql Server avec une table Access
    Par mirage3000 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 02/09/2011, 03h59
  3. Lie des table SQL server sur access
    Par ahmed_amine dans le forum Administration
    Réponses: 1
    Dernier message: 05/08/2011, 18h19
  4. Réponses: 1
    Dernier message: 05/06/2010, 01h29
  5. Utilisation des tables SQL Server 2005 dans Delphi
    Par xeak2008 dans le forum Débuter
    Réponses: 2
    Dernier message: 27/08/2008, 13h35

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