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

Accès aux données Discussion :

[SQlite -C#] Mise à jour rapide


Sujet :

Accès aux données

  1. #1
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    septembre 2008
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : septembre 2008
    Messages : 871
    Points : 300
    Points
    300
    Par défaut [SQlite -C#] Mise à jour rapide
    Bonjour,

    Je débute en SQL, et j'ai déjà réussi à ajouté rapidement des lignes (4096) en un clin d'œil avec BeginTransaction:

    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
     
     public int ExecuteWriteAllDictionary(string CommandLine, Dictionary<int, Dictionary<string, object>> Dic = null, string BaseSqlite = "base.db")
            {
                try
                {
                    int numberOfRowsAffected = 0;
                    Dtbase = "Data Source=" + BaseSqlite;
                    // Creates new sqlite database if it is not found
                    using (var con = new SQLiteConnection(Dtbase))
                    {
                        con.Open();
                        using (var cmd = new SQLiteCommand(con))
                        {
                            using (var transaction = con.BeginTransaction())
                            {
                                // 100,000 inserts
                                for (int h = 0; h <= Dic.Count - 1; h++)
                                {
                                    cmd.CommandText = CommandLine;
                                    if (Dic != null)
                                    {
                                        if (Dic.ContainsKey(h))
                                        {
                                            Dictionary<string, object> args = Dic[h];
     
                                            foreach (KeyValuePair<string, object> entry in args)
                                            {
                                                cmd.Parameters.AddWithValue(entry.Key, entry.Value);
                                            }
                                        }
                                    }
                                    numberOfRowsAffected += cmd.ExecuteNonQuery();
                                }
                                transaction.Commit();
                            }
                        }
                    }
                    return numberOfRowsAffected;
                }
                catch (Exception ex)
                {
                    return -1;
                }
     
            }
    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
     
    Dictionary<int, Dictionary<string, object>> dic = new Dictionary<int, Dictionary<string, object>>();
    query = "INSERT INTO Table(Var1, Var2, Var3, Var4, Var5, Var6, Var7, var8) " +
                 "VALUES (@Var1, @Var2, @Var3, @Var4, @Var5, @Var6, @Var7, @Var8 )";
    for (int h = 0; h < DicoBase.Length; h++)
    {
          var args = new Dictionary<string, object> {
              {"@Var1", mVar1},
              {"@Var2", mVar2},
              {"@Var3", mVar3},
              {"@Var4", mVar4},
              {"@Var5", mVar5},
              {"@Var6", mVar6},
              {"@Var7", mVar7},
              {"@Var8", mVar8}
          };
          dic.Add(h, args);
    }
    ExecuteWriteAllDictionary(query, dic)

    Voila, cela fonctionne très bien, mais est-ce que l'on peut l'adapter pour un Update avec des closes WHERE, pour le moment j'ai bien-sûr essayé:



    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
     
    Dictionary<int, Dictionary<string, object>> dic = new Dictionary<int, Dictionary<string, object>>();
    query = "UPDATE MaTable SET Var1 = '@Var1' WHERE Var2 = '@Var2'";
     
     foreach (string var in myTable.Keys)
                {
                    string mVar1= myTable[var].Var1;
                    string mVar2 = myTable[plageE].Var2;
     
                    var args = new Dictionary<string, object> {
                        {"@Var1", mVar1},
                        {"@Var2", mVar2}
                    };
                    dic.Add(y, args);
                    y++;
                }
                ExecuteWriteAllDictionary(query, dic)
    Mais cela ne fonctionne pas, il m'indique une erreur de syntaxe. J'ai essayé avec et sans les cotes ' .

    Y a t'il un moyen que cela fonctionne dans le même principe, car envoyer la mise à jour ligne par ligne prend un temps fou.

    Merci de votre aide.

  2. #2
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juin 2022
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : juin 2022
    Messages : 11
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    Je confirme que vous n'avez pas besoin des simple cotes pour l'update.

    Votre requête a l'air bonne, cependant votre table s'appel Table dans l'Insert et MaTable dans l'Update, ca ne viendrait pas de là ?

  3. #3
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    septembre 2008
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : septembre 2008
    Messages : 871
    Points : 300
    Points
    300
    Par défaut
    Citation Envoyé par Pronoia Voir le message
    Bonjour,

    Je confirme que vous n'avez pas besoin des simple cotes pour l'update.

    Votre requête a l'air bonne, cependant votre table s'appel Table dans l'Insert et MaTable dans l'Update, ca ne viendrait pas de là ?
    Bonjour Pronoia,

    Merci pour l'information des simple cotes.

    Pour le nom, non pas de souci, j'ai modifié les vrai terme que j'utilise et j'ai mais écris tout simplement la même dans les 2 mais non cela ne viens pas de là.

    Merci en tout cas.

    J'ai oublié de re-préciser dans mon message que je suis en SQlite, même si je l'ai mis dans le titre. Il a peut être des limitations à ce sujet.

  4. #4
    Membre émérite Avatar de tsuji
    Inscrit en
    octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 1 558
    Points : 2 731
    Points
    2 731
    Par défaut
    Mais cela ne fonctionne pas, il m'indique une erreur de syntaxe. J'ai essayé avec et sans les cotes ' .
    Comme dit, sans les cotes' il devrait, Mais le message devrait contenir plus de détail qu'indiquer une erreur de syntaxe ! Quel est le message complet ?

    Avec le code indicatif, je vois vous avez nommé des variables d'une manière problématique.

    [1] foreach (string var in ...)
    Vous pouvez probablement sortir sain et sauf, mais ça invite d'imagination.

    [2] var args = new Dictionary<string, object> { ... }
    Pas de problème sur la constructeur, mais le nom de variable "args". Dans pas mal de circonstances, ça peut provoquer en temps de compilation déjà.

    C'est pourquoi il serait plus utile de mettre le message d'erreur plus substantif ...

Discussions similaires

  1. Réponses: 8
    Dernier message: 18/07/2014, 11h56
  2. [Gtkmm] Mise à jour graphique plus rapide.
    Par Klaim dans le forum GTK+ avec C & C++
    Réponses: 4
    Dernier message: 23/06/2011, 17h24
  3. Mise à jour bibliothèque sqlite sous linux
    Par ovni76 dans le forum SQLite
    Réponses: 0
    Dernier message: 08/03/2011, 10h35
  4. [Lazarus] Mise à jour affichage DbGrid et table Sqlite
    Par ovni76 dans le forum Lazarus
    Réponses: 1
    Dernier message: 31/03/2010, 08h16
  5. Mise à jour d'une Table-Sqlite pendant son parcours
    Par fadsys dans le forum PureBasic
    Réponses: 1
    Dernier message: 02/10/2009, 13h34

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