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 :

lecture et écriture dans une base :o


Sujet :

VB.NET

  1. #1
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 24
    Par défaut lecture et écriture dans une base :o
    Bonjour,

    Pouvez vous m'aider ?
    Merci déjà d'avoir lu mon message

    DOnc je suis développeur DEBUTANT, donc pas de ouhhh svp

    voila mon souci
    Une base de donnée SQLSERVER génère un fichier .txt dans ce fichier on retrouve sur chaque ligne 2 champs qui sont écrit de cette facon
    "1542848562842//articles 1"
    Ce fichier txt est ensuite envoyé à un pocket pc qui est sous windows mobile 5.0
    dans ce pocket pc il y a un programme qui est censé récupérer ce fichier txt et le lire et faire des "insert" dans une base de données sqlCE chaque champs du fichier correspondant à un champs de la table "articles" .
    voila donc tout marche très bien mais le problème c'est que ces trop lent en effet 50 000 lignes dans le fichier txt et je faisais un insert pour chaque ligne ce qui donne plus de 10 min d'attente (énorme)
    Donc je cherche une solution pour optimiser tout ca
    une solution du coté du code car le fichier txt recu sera toujours en txt je ne peux pas demander une simple synchro base de donnée sqlSErver et sqlServerCE
    Voila merci pour votre aide

    voici le code : Je rappelle que c'est écrit en vb.net peu importe le type de connexion mais il me semble que le xmlShema ne marche pas en pocketpc


    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
     If File.Exists(sFichier) Then
     
                    sr = New StreamReader(sFichier)
     
     
                    If sr.Peek <> -1 Then 'si le fichier n'est pas vide
                        PSqlCeCommand = PSqlCeConnection.CreateCommand()
                        PSqlCeCommand.CommandText = "DELETE FROM Articles"
                        PSqlCeCommand.ExecuteNonQuery() 'effacement de la table articles
                        PSqlCeCommand.Dispose()
     
                        Do Until sr.Peek = -1 'scan de chaque ligne du fichier jusk'a la fin
     
                            sLigne = sr.ReadLine()
     
                            If sLigne <> "" Then 'evite les lignes vides qui provoquent des erreurs
     
     
                                sEnr = sLigne.Split(CsSeparateur)
                                sCB = sEnr(0)
                                sLibLong = sEnr(2)
     
     
     
     
                                sTest = "INSERT INTO Articles (CodeBarre, LibelleLongArticle) VALUES ('" & sCB & "','" & sLibLong & "')"
     
                                PSqlCeCommand = PSqlCeConnection.CreateCommand()
     
                                PSqlCeCommand.CommandText = sTest
     
                                PSqlCeCommand.ExecuteNonQuery()
                                PSqlCeCommand.Dispose()
     
                            End If
     
                        Loop
     
                    End If
     
                End If
    Merci encore..

  2. #2
    Membre chevronné
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 400
    Par défaut
    Bonjour,

    Je ne suis spécialiste du FrameWork mobile mais je dirai que le fait de passer en XMl n'arrangerai rien au problème. De façon plus générale, je vois deux solutions :

    - Récupérer le fichier .txt de façon plus régulière pour éviter qu'il y ait autant de lignes, et etre sûr que chaque ligne nécessite d'etre 'redescendue' et synchronisée (mettre un flag dans la base SQl 'synchroOK' par exemple).

    -Augmenter la puissance du PPC ou le débit entrant de la connexion pour récupérer le fichier .txt

    Bon courage

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Tu pourrais améliorer un peu les perfs en ne recréant pas PSqlCeCommand à chaque fois. Pour cela, il faut créer une commande avec des paramètres. Tu crées la commande au début, et ensuite à chaque passage dans la boucle tu changes les paramètres. Ca évite que SQL Server recompile la commande à chaque fois...
    Voilà comment faire (je suis pas certain des détails, j'utilise pas SQLServer d'habitude...) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    PSqlCeCommand = PSqlCeConnection.CreateCommand()
    PSqlCeCommand.CommandText = "INSERT INTO Articles (CodeBarre, LibelleLongArticle) VALUES (@CB,@LibLong)"
    PSqlCeCommand.Parameters.Add("@CB", SqlDbType.NVarChar)
    PSqlCeCommand.Parameters.Add("@LibLong", SqlDbType.NVarChar)
     
    Do Until ...
    ...
    PSqlCeCommand.Parameters["@CB"].Value = sCB
    PSqlCeCommand.Parameters["@LibLong"].Value = sLibLong
    PSqlCeCommand.ExecuteNonQuery
    ...
    Loop

  4. #4
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 24
    Par défaut
    Tout d'abord merci à ceux qui ont répondu j'ai essayé le code que t as écrit et ca a pas l'air de marcher,
    bon je suis toujours à la recherche d'une solution
    Si il y a des pros bienvenue bienvenue

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    j'ai écrit ce code vite fait, mais y a sans doute des petites modifs à apporter... regarde dans la doc comment utiliser des paramètres pour ta commande

  6. #6
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 24
    Par défaut
    Oui, ton code j'ai réussi à le faire fonctionner;
    voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    PSqlCeCommand = PSqlCeConnection.CreateCommand()
    PSqlCeCommand.CommandText = "INSERT INTO Articles (CodeBarre, LibelleLongArticle) VALUES (?, ?)"
    PSqlCeCommand.Parameters.Add("@CB", SqlDbType.NVarChar)
    PSqlCeCommand.Parameters.Add("@LibLong", SqlDbType.NVarChar)
     
    'et voici ce qu'il faut rajouter dans la boucle
    '.....
     PSqlCeCommand.Parameters(0).Value() = sCB.ToString
    PSqlCeCommand.Parameters(1).Value() = sLibLong
    PSqlCeCommand.ExecuteNonQuery()
    '....
    Ca marche mieux c'est vrai mais au lieu de 15 min je suis à 12 min c'est pas la fête on dirait
    Mais ca m'a permis d'apprendre une autre syntaxe merci

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Ah oui, c'est vrai que c'est du VB... j'avais fait un joyeux mélange de code VB et C#
    Sinon pour améliorer encore, il faudrait pouvoir insérer plusieurs lignes à la fois... je crois que c'est possible, mais je sais pas trop comment

  8. #8
    Membre chevronné
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 400
    Par défaut
    Bonsoir,

    Normalement en séparant les requête d'INSERT par un ; tu devrais pouvoir en exécuter plusieurs d'un coup .

    A bientôt

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    bien vu... mais dans ce cas tu ne plus vraiment utiliser de paramètres. Cela dit je pense que le gain de performance avec cette méthode est plus significatif qu'avec les paramètres, donc c'est peut-être mieux au final.

  10. #10
    Membre Expert
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 182
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 182
    Par défaut
    Bonjour.

    Attention, je vais peut-être dire une C...

    Pour utiliser des paramétres et pouvoir concaténer facilement les ordre insert, tu pourrais utiliser un SqlCommandBuilder.GetInsertCommand.

    En bouclant sur les lignes du fichiers et en gettant pour chaque ligne un insert de builder que tu concaténes à l'ordre SQL, ça devrait le faire.

    Cdt.

  11. #11
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 24
    Par défaut
    oulahlah ca commence à chauffer niveau idée merci


    L'histoire de faire plusieurs insert à l air bien des tuyaux ? un exemple de code ???
    merci

  12. #12
    Membre Expert
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 182
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 182
    Par défaut
    Bonjour.

    J'avais raison, j'ai bien dit une C... !

    Oublie ma proposition y'a rien a en tirer...

    Mais pourquoi se compliquer la vie :
    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
     
            Dim strSQLQuery As String = ""
            Dim p1 As String
            Dim p2 As String
     
            For i As Integer = 1 To 50
     
                p1 = "A" & i.ToString
                p2 = "B" & i.ToString
     
                strSQLQuery = strSQLQuery & _
                "INSERT INTO Table1 (Col1, Col2) VALUES ( " & _
                "'" & p1 & "'," & _
                "'" & p2 & "');"
     
                If i Mod 10 = 0 Then
                    ' Ici l'executenonquery
                    System.Windows.Forms.MessageBox.Show(strSQLQuery)
                    strSQLQuery = ""
                End If
     
            Next
    J'ai un peu honte là ...

    Mais bon, ça marche.

    Pour gagner encore plus de temps, tu peux dropper les index, charger et recréer les index à l'issue du chargement.

    C'est bête mais il semble que SQL Server CE ne prend pas en charge le Bulk Insert (je ne l'ai pas trouvé dans le guide de réf mais je n'ai pas pu vérifier car je n'ai pas l'édition CE). Sinon c'était tout bête.

    Cdt.

Discussions similaires

  1. Réponses: 0
    Dernier message: 05/04/2011, 01h09
  2. Réponses: 5
    Dernier message: 19/08/2010, 02h10
  3. Réponses: 5
    Dernier message: 21/07/2007, 09h20
  4. [ODBC] écriture dans une base access 97
    Par menuge dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 21/05/2007, 13h24
  5. Réponses: 3
    Dernier message: 23/03/2007, 07h54

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