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

SQL Oracle Discussion :

[C#] Insertion d'une grande quantité de données (330 000 lignes)


Sujet :

SQL Oracle

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

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 928
    Points : 312
    Points
    312
    Par défaut [C#] Insertion d'une grande quantité de données (330 000 lignes)
    Bonjour,

    Je débute dans les bases de données avec déjà avec 3 bases, SQlite en local, et MySql ou Oracle en Distant, avec des synchronisation à faire.

    Je développe en C# et using Oracle.ManagedDataAccess.Client.

    Pour Sqlite et MySql les requêtes paramétrées fonctionnent très bien. bon je n'ai pas essayé encore avec autant de ligne donc à tester sur des si grosse data (330 000 lignes).

    Par contre pour Oracle cela compile en C# mais plante lorsque je fait mon 2eme ExecuteNonQuery();

    -->C'est pour du test pour le moment, normalement les synchronisations sont régulière et l'on devrait pas à avoir à faire passer autant de data, mais en cas de plantage du serveur Oracle, les systèmes continue de tourner en chargeant la base local SQLite donc potentiellement la base local pourrait grossir, donc il faut que cela fonctionne.


    Voila comment je fais avec SQLite: (J'ai épuré le code)
    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
     
     
    using Oracle.ManagedDataAccess.Client;
     
    /*L'appel de la fonction:*/
     
    public void TestOracle (MES_DATAS mes_Dm)
    {
     int idx = 0;
    Dictionary<int, Dictionary<string, object>> DicArgs = new Dictionary<int, Dictionary<string, object>>();
    string query = "INSERT INTO DOS(UPT_TIME, NUMERO, DATE, EP) VALUES(@UPT_TIME, @NUMERO, @DATE, @EP)";
    foreach (DOS_ME dm in mes_Dm)
    {
        Dictionary<string, object> args = new Dictionary<string, object>
        {
            { "@UPT_TIME", dm.Upd },
            { "@NUMERO", dm.ID },
            { "@DATE", dm.tmStamp},
            { "@EP", dm.Ep },
        };
        DicArgs.Add(idx, args);
        idx++;
    }
    ExecuteWriteAllParamDictionary(query, DicArgs);
    }
     
    /*La fonction Oracle*/
     
    public int ExecuteWriteAllParamDictionary(string CommandLine,  Dictionary<int, Dictionary<string, object>> Dic )
    {
     using (var con = new SQLiteConnection(Dtbase))
                    {
                        con.Open();
                        using (var cmd = new SQLiteCommand(con))
                        {
                            using (var transaction = con.BeginTransaction())
                            {
     
                                for (int h = 0; h <= Dic.Count - 1; h++)
                                {
                                    cmd.CommandText = CommandLine;
     
     
                                            args = Dic[h];
     
                                            foreach (KeyValuePair<string, object> entry in args)
                                            {
                                                cmd.Parameters.AddWithValue(entry.Key, entry.Value);
                                            }
                                            cmd.Prepare();
     
                                    numberOfRowsAffected += cmd.ExecuteNonQuery();
                                }
                                transaction.Commit();
                            }
                        }
                    }
    }
    J'ai trouvé une idée ICI l
    Mais cela utilise leur fonctionnalités, pas ceux native de Oracle.ManagedDataAccess.

    Mon collège m'a fait un fichier a insérer manuellement dans Oracle (pour les test) mais je trouve cela bien long malgré tout.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    REM INSERTING into ALARME_mp
    SET DEFINE OFF;
     
    INSERT ALL
    INTO ALARME_mp (ID,LIB,DO,UPT_TIME) VALUES ('1','Alarme par défaut','6400',to_date('11/04/22','DD/MM/RR'))
    INTO ALARME_mp (ID,LIB,DO,UPT_TIME) VALUES ('2','Installations C','500',to_date('16/08/22','DD/MM/RR'))
    etc.
    SELECT * FROM DUAL;
     
    etc.
    Mais il y en a pour environs 10 minutes a envoyer toutes les tables dont la plus grosse de plus de 330 000 lignes.

    Il est possible de faire du paramétré avec Oracle.ManagedDataAccess.Client ?

    Merci

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Bonjour,

    D'où proviennent les valeurs à insérer?

    Dans Oracle le INSERT ALL ça sert normalement à insérer dans des tables différentes. Ici tu peux écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO ALARME_mp (ID,LIB,DO,UPT_TIME)
    select '1','Alarme par défaut','6400',to_date('11/04/2022','DD/MM/YYYY') from dual
    union all
    select '2','Installations C','500',to_date('16/08/2022','DD/MM/YYYY') from dual;
    Au fait c'est une mauvaise pratique de spécifier le masque d'une année sur seulement 2 chiffres.

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

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 928
    Points : 312
    Points
    312
    Par défaut
    Bonjour,

    Merci d'avoir répondu.

    Citation Envoyé par vanagreg Voir le message
    Bonjour,

    D'où proviennent les valeurs à insérer?
    Je précise bien, c'est uniquement pour les test des fonctions, mais dans le cas présent c'est une base que j'ai récupéré d'un client, je me la suis exporter en CSV afin de la relire et la mettre en forme pour l'envoyer dans cette même base oracle que j'ai nettoyé. En fait je simule que la base Oracle est HS pendant un moment, le logiciel sur les bornes enregistre donc les données uniquement en local et lorsque la base Oracle refonctionne je dois donc tout synchroniser.

    Pour le teste final de cette grosse synchronisation: Je chargerais ces données dans ma base local (SQLite) , mais normalement en lecture j'ai pas eue de souci pour le moment.

    [QUOTE=vanagreg;11908985]
    Dans Oracle le INSERT ALL ça sert normalement à insérer dans des tables différentes. Ici tu peux écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO ALARME_mp (ID,LIB,DO,UPT_TIME)
    select '1','Alarme par défaut','6400',to_date('11/04/2022','DD/MM/YYYY') from dual
    union all
    select '2','Installations C','500',to_date('16/08/2022','DD/MM/YYYY') from dual;
    Je vais regarder pour appliquer cela en C#.


    Citation Envoyé par vanagreg Voir le message
    Au fait c'est une mauvaise pratique de spécifier le masque d'une année sur seulement 2 chiffres.
    Je vous l'accorde, mais des sites sont déjà en activités avec ces bases donc je dois m'adapter.

    Merci.

Discussions similaires

  1. Envoyer une grande quantité de données dans un xml via http
    Par qdaemon_fr dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 03/03/2009, 09h51
  2. Manipulation d'une grande quantité de données
    Par sebastyen dans le forum Langage
    Réponses: 1
    Dernier message: 10/11/2008, 15h54
  3. Réponses: 11
    Dernier message: 23/09/2008, 15h39
  4. Une grande quantité de données sur Oracle 8i?
    Par bliml dans le forum Oracle
    Réponses: 13
    Dernier message: 01/03/2007, 11h45
  5. Réponses: 1
    Dernier message: 10/01/2007, 15h52

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