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

ASP Discussion :

Importer un gros fichier SQL


Sujet :

ASP

  1. #1
    Membre averti Avatar de sami_c
    Profil pro
    Chef de projet
    Inscrit en
    Mai 2002
    Messages
    751
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Chef de projet

    Informations forums :
    Inscription : Mai 2002
    Messages : 751
    Points : 371
    Points
    371
    Par défaut Importer un gros fichier SQL
    Salut,
    J'ai écris un script permettant d'exécuter les requêtes sql d'un fichier donné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	const ForReading = 1
    	const TristateFalse = 0
    	dim objFS
    	dim objFile
    	dim objTS
    	set objFS = Server.CreateObject("Scripting.FileSystemObject")
    	set objFile = objFS.GetFile(Server.MapPath("script.sql"))
    	set objTS = objFile.OpenAsTextStream(ForReading, TristateFalse)
    	filecontent = objTS.Read(objFile.Size)
     
    	objConn.execute(filecontent)
    j'ai testé sur un petit script sql de 3 requêtes et ça a fonctionné. J'ai testé sur un sql réel de 6mo (environ 1500 INSERT) et le résultat est aléatoire : parfois je trouve dans ma base uniquement 200 enregistrement, parfois 205, parfois 199 ... bref je n'ai pas compris ce qui ne va pas ! quelqu'un peut m'aider svp ?? Merci
    '...parfois l'informatique peut vous rendre fou...'

  2. #2
    Membre expérimenté
    Avatar de ryan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2003
    Messages
    956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 956
    Points : 1 316
    Points
    1 316
    Billets dans le blog
    1
    Par défaut
    Yop!


    Un problème de time-out?
    Un ascenseur est une machine qui passe quand même la moitié de son temps à descendre.

  3. #3
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Salut,

    Tu devrais peut-être lire les lignes une à une.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  4. #4
    Membre averti Avatar de sami_c
    Profil pro
    Chef de projet
    Inscrit en
    Mai 2002
    Messages
    751
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Chef de projet

    Informations forums :
    Inscription : Mai 2002
    Messages : 751
    Points : 371
    Points
    371
    Par défaut
    ryan > j'ai augmenté le timeout de l'exécution des script ASP, mais je pense que je n'ai pas pensé au timeout de sql server ... je vais tester

    Immobilis > je ne peux pas car j'ai des requêtes qui inserrent du texte contenant lui même des retour à la ligne et des ';' ... donc pas moyen de retrouver les lignes INSERT !
    '...parfois l'informatique peut vous rendre fou...'

  5. #5
    Membre averti Avatar de sami_c
    Profil pro
    Chef de projet
    Inscrit en
    Mai 2002
    Messages
    751
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Chef de projet

    Informations forums :
    Inscription : Mai 2002
    Messages : 751
    Points : 371
    Points
    371
    Par défaut
    ryan > je viens de tester mais j'ai toujours le même problème !! De plus, s'il y avait un problème de timeout, j'aurais un message d'erreur non ?
    '...parfois l'informatique peut vous rendre fou...'

  6. #6
    Membre expérimenté
    Avatar de ryan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2003
    Messages
    956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 956
    Points : 1 316
    Points
    1 316
    Billets dans le blog
    1
    Par défaut
    Yop!


    De plus, s'il y avait un problème de timeout, j'aurais un message d'erreur non ?
    Voui, logiquement...Mais si ça marche avec un petit fichier et que ça plante avec un gros fichier, ça sent quand même le problème de timeout.

    Tu devrais scinder tes requêtes. J'ai lu ce que tu répondais à Immobilis, mais si SQL peut trouver la fin d'un INSERT, tu devrais aussi y arriver.
    Un ascenseur est une machine qui passe quand même la moitié de son temps à descendre.

  7. #7
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Tu peux nous donner un échantillon de ton fichier?
    "Winter is coming" (ma nouvelle page d'accueil)

  8. #8
    Modérateur
    Avatar de roro06
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    1 480
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 480
    Points : 1 978
    Points
    1 978
    Par défaut
    Bonjour

    ... et dans une transaction ?

    filecontent = objTS.Read(objFile.Size)

    objConn.BeginTrans()
    objConn.execute(filecontent)
    objConn.CommitTrans()


    N'oubliez pas de consulter les FAQ ASP et les cours et tutoriels ASP

    " La vie c'est quelque chose de très fort et de très beau.... La vie appartient a tous les vivants. It's both a dream and a feeling. C'est être ce que nous ne sommes pas sans le rester. La vie c'est mourir aussi....Et mourir c'est vraiment strong...c'est rester en vie au delà de la mort...Tous ceux qui sont morts n'ignorent pas de le savoir."
    (J.C. VanDamme, humoriste et philosophe belge . A moins que ce ne soit l'inverse ...)

    Chuck Norris comprend JC Van Damme.

  9. #9
    Membre averti Avatar de sami_c
    Profil pro
    Chef de projet
    Inscrit en
    Mai 2002
    Messages
    751
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Chef de projet

    Informations forums :
    Inscription : Mai 2002
    Messages : 751
    Points : 371
    Points
    371
    Par défaut
    Citation Envoyé par Immobilis Voir le message
    Tu peux nous donner un échantillon de ton fichier?
    Voici un fichier de 6mo
    http://membres.lycos.fr/samtaz/_sql.v4.1.sql

    le même fichier rarré :
    http://membres.lycos.fr/samtaz/_sql.v4.1.rar
    '...parfois l'informatique peut vous rendre fou...'

  10. #10
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Tu devrais peut-être essayer Bulk Insert: http://msdn.microsoft.com/fr-fr/library/ms188365.aspx

    J'ai l'impression qu'il y a pas mal de déchets dans ce fichier. Notement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT @@IDENTITY as last_id;
    La valeur n'a pas l'air d'être reprise.

    As-tu un moyen de diviser ce fichier? Tu le reçois comme ça?

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2008
    Messages : 47
    Points : 46
    Points
    46
    Par défaut
    Tu pourrais aussi faire une lecture par ligne, et faire ta requete a chaque ligne pour cette lecture. Ainsi tu pourrais voir exactement ce qui se passe.

  12. #12
    Membre averti Avatar de sami_c
    Profil pro
    Chef de projet
    Inscrit en
    Mai 2002
    Messages
    751
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Chef de projet

    Informations forums :
    Inscription : Mai 2002
    Messages : 751
    Points : 371
    Points
    371
    Par défaut
    Citation Envoyé par smerek Voir le message
    Tu pourrais aussi faire une lecture par ligne, et faire ta requete a chaque ligne pour cette lecture. Ainsi tu pourrais voir exactement ce qui se passe.
    Je ne peux pas lire le fichier ligne par ligne car les valeurs à insérer contiennent des retours à la ligne, comment faire donc pour différentier entre un retour à la ligne du texte et celui d'une requête sql ?
    '...parfois l'informatique peut vous rendre fou...'

  13. #13
    Membre averti Avatar de sami_c
    Profil pro
    Chef de projet
    Inscrit en
    Mai 2002
    Messages
    751
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Chef de projet

    Informations forums :
    Inscription : Mai 2002
    Messages : 751
    Points : 371
    Points
    371
    Par défaut
    Citation Envoyé par Immobilis Voir le message
    As-tu un moyen de diviser ce fichier? Tu le reçois comme ça?
    En fait le fichier sql a été généré par un script ASP que j'ai écris. Comment tu vois le découpage ? je pourrait peut être découper chaque requête dans un fichier SQL à part mais vu que j'ai 84 000 enregistrement...j'aurais aussi 84 000 fichiers !! Bon je peux faire N requêtes SQL par fichier mais j'aurais toujours beaucoup de fichiers !
    '...parfois l'informatique peut vous rendre fou...'

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2008
    Messages : 47
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par sami_c Voir le message
    Je ne peux pas lire le fichier ligne par ligne car les valeurs à insérer contiennent des retours à la ligne, comment faire donc pour différentier entre un retour à la ligne du texte et celui d'une requête sql ?
    Une fin de requete est fait avec un ';', tu peux donc, normalement, découper tes requetes en recherchant chaque ; ...

  15. #15
    Membre averti Avatar de sami_c
    Profil pro
    Chef de projet
    Inscrit en
    Mai 2002
    Messages
    751
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Chef de projet

    Informations forums :
    Inscription : Mai 2002
    Messages : 751
    Points : 371
    Points
    371
    Par défaut
    certaines colonnes de type texte contiennent des ";" !!! donc impossible de dire que les ";" se trouvent uniquement à la fin des requêtes !!
    Exp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mon piano ; il devient ...' WHERE id_ticketnet='125929';
    '...parfois l'informatique peut vous rendre fou...'

  16. #16
    Membre expérimenté
    Avatar de ryan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2003
    Messages
    956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 956
    Points : 1 316
    Points
    1 316
    Billets dans le blog
    1
    Par défaut
    Yop!

    S'il est assez compliqué de trouver la fin d'une requête, il est par contre assez simple d'en trouver le début.

    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
     
    <html>
    <body>
    <%	
     
      if request.form("position") <> "" then
        position = request.form("position")
      else   
        position = 0
      end if
     
      const ForReading = 1
      const TristateFalse = 0
      dim objFS
      dim objFile
      dim objTS
      set objFS = Server.CreateObject("Scripting.FileSystemObject")
      set objFile = objFS.GetFile(Server.MapPath("script.sql"))
      set objTS = objFile.OpenAsTextStream(ForReading, TristateFalse)
     
      filecontent = objTS.Read(objFile.Size)
      filecontent = Right(filecontent, objFile.Size - position)
     
      tableau = Array(0,0,0,0)
     
      tableau(0) = Instr(6,filecontent,"DELETE")
      tableau(1) = Instr(6,filecontent,"UPDATE")
      tableau(2) = Instr(6,filecontent,"INSERT")
      tableau(3) = Instr(6,filecontent,"SELECT")
     
      for i = 0 to 3
        for j = i + 1 to 3
          if tableau(i)< tableau(j) then
            x = tableau(j)
             tableau(j) = tableau(i)
            tableau(i) = x
          end if
        next	
      next	
     
      for i = 0 to 3 
        if tableau(i) <> 0 then
          endreq = tableau(i)
        end if  
      next
     
      if endreq <> 0 then
        req = trim(left(filecontent,endreq - 3))
        response.write req 
        response.write "<form action='slice.asp' method=POST>"
        response.write "<input type=hidden name='position' value='" & position + endreq - 1 & "'>"
        response.write "<input type=submit value='NEXT'>"
        response.write "</form>"
      else
        response.write "FINI"
      end if    
     
    %>
    </body>
    </html>
    Un ascenseur est une machine qui passe quand même la moitié de son temps à descendre.

  17. #17
    Membre averti Avatar de sami_c
    Profil pro
    Chef de projet
    Inscrit en
    Mai 2002
    Messages
    751
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Chef de projet

    Informations forums :
    Inscription : Mai 2002
    Messages : 751
    Points : 371
    Points
    371
    Par défaut
    merci ryan, mais avant de me lancer en utilisant ta méthode, je voudrais avoir un avis :
    En fait le fichier SQL est généré par mon script ASP qui traite un gros fichier texte (de 8mo) et inserre les données dans la bdd. Le problème est que le fichier texte ne contient aucun retour à la ligne, en fait c'est une sorte de csv mais les enregistrements sont séparés par la chaine |~END~| donc je ne peux pas lire le fichier ligne par ligne, je lit tout le fichier d'un seul coup dans un tableau puis je le découpe en utilisant le délimiteur !! Avez-vous une meilleur solution ?
    Voilà le code du script qui exploite le gros fichier texte de 8mo :
    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
     
    ' Pour éviter le timeout :
    Server.ScriptTimeout = 14400
    response.Buffer= false
     
    ' Ouverture du fichier 1
    const ForReading = 1
    const TristateFalse = 0
    dim strSearchThis
    dim objFS
    dim objFile
    dim objTS
    set objFS = Server.CreateObject("Scripting.FileSystemObject")
    set objFile = objFS.GetFile(Server.MapPath(tarif_file))
    set objTS = objFile.OpenAsTextStream(ForReading, TristateFalse)
    filecontent = objTS.Read(objFile.Size)
     
    'Délimiteur des enregistrements : |~END~|
    tableau_1 =split(filecontent,"|~END~|",-1,1)
    for i=0 to UBound(tableau_1)-1
            ' Délimiteur des colonnes d'un enreg : |
    	tableau_2 =split(tableau_1(i),"|",-1,1)
            ...
    '...parfois l'informatique peut vous rendre fou...'

  18. #18
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Citation Envoyé par sami_c Voir le message
    |~END~|
    Bon ben c'est cool, t'as un indicateur. Tu peux te faire une macro qui le remplace et ensuite tu traites ligne par ligne.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  19. #19
    Membre averti Avatar de sami_c
    Profil pro
    Chef de projet
    Inscrit en
    Mai 2002
    Messages
    751
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Chef de projet

    Informations forums :
    Inscription : Mai 2002
    Messages : 751
    Points : 371
    Points
    371
    Par défaut
    l'admin du site m'a conseillé d'utiliser DTS, j'ai fais une recherche est je suis tombé sur ceci :
    http://msdn.microsoft.com/fr-fr/libr...0(sql.80).aspx

    j'ai rien compris comment je peux utiliser DTS pour importer les gros fichiers SQL ??
    '...parfois l'informatique peut vous rendre fou...'

  20. #20
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Un package DTS est un ensemble d'instructions qui vont te permettre de créer un "programme" qui sera exécuter sur un serveur SQL Server 2000. On peut faire des migrations de bases de données avec.

    Tu peux avoir un idée de ce que cela représente en faisant un import/export de tables.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

Discussions similaires

  1. Importer des gros fichiers
    Par Shivan dans le forum Général Java
    Réponses: 1
    Dernier message: 05/11/2008, 21h23
  2. Importer un gros fichier SQL sous windows
    Par bigsister dans le forum Outils
    Réponses: 2
    Dernier message: 24/08/2007, 15h17
  3. Importer un gros fichier
    Par tbassetto dans le forum Administration
    Réponses: 3
    Dernier message: 19/05/2007, 10h13
  4. Importation d'un fichier .sql en commande sql
    Par mysterywhiteboy59 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 31/07/2006, 21h08
  5. [phpMyAdmin] importation d'un fichier .sql volumineux dans phpMyAdmin problématique
    Par allowen dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 23/06/2006, 09h52

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