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 :

Verifier qu une ligne existe ou pas pour insertion


Sujet :

Accès aux données

  1. #1
    Membre actif
    Inscrit en
    Juillet 2007
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 357
    Points : 280
    Points
    280
    Par défaut Verifier qu une ligne existe ou pas pour insertion
    Bonjour

    J ai une appli c# qui doit inserer des lignes dans une base oracle a raison de une ligne a la fois. Je doit implementer un parametrage du type .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    enum ActionSiLigneExiste
    {
    SKIP,
    REPLACE,
    THROW_EXCEPTION
    }
    MA methode est de faire

    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
     
    while (.....)
    {
      l_oracledatacommand.commandtext = "INSERT INTO X VALUES(:Y)";
      ...
      try
    {
      oracledatacommand.Executenonquery();
    }
    catch (OracleException e)
    {
      if (Regex.ismatch(e.message,@"^ORA-00001"))
     {
        //TRAITE SUIVANT LE PARAMETRAGE
     }
    }
    }
    A part faire un "select count(*) from X where id = :Y" ,
    quelq' un a t'il une meilleure methode et adaptable a tout type de base de données

    Merci

  2. #2
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Points : 12 465
    Points
    12 465
    Par défaut
    pourquoi tu ne passe pas par une procedure stockee (package dans le cas oracle)?

    sinon, tu peux faire l'inverse, a savoir, si le type de traitement a faire, c'est replace, tu commence par faire un update, si l'update te renvoies 0 (les updates, renvoient le nombre de lignes modifiees, si je me rappelle bien), tu inseres, par contre, pour le skip, et la remontee d'exception....bah ce sera probablement moins couteux de faire le test avant...

    l'un dans l'autre, faire un package serait probablement le mieux, moins portable, mais plus performant...apres, reste a voir le nombre de lignes a traiter, si tu dois mettre en base une 10aine - 100aine de lignes a chaque fois, autant tester pour chaque ligne

    De toute facon, cote "vitesse", le cout d'une exception risque bien d'etre plus important que le cout de 1000 requetes (bon, apres, niveau traffic, ca va pas etre pareil )

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 37
    Points : 30
    Points
    30
    Par défaut
    je confirme les informations du dernier message le cout de l'exception et plus important qu'une simple requete select de vérification.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Points : 2 203
    Points
    2 203
    Par défaut
    Tu peux surtout utiliser un dataset typé.

    Tu pourras ajouter des rows typés,
    Tu pourras gérer les états (ajouté, supprimé,etc,etc...)

    Et surtout, tu ne travailleras pas sur la base.

    Donc, ça sera bien plus rapide.

  5. #5
    Membre actif
    Inscrit en
    Juillet 2007
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 357
    Points : 280
    Points
    280
    Par défaut
    Tu peux surtout utiliser un dataset typé.
    Dans mon cas ca ne peut pas marcher car je recupere environ 6 millions de lignes avec des long raw pour les convertir et les remettre dans une nouvelle table.

  6. #6
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par B.AF Voir le message
    Tu peux surtout utiliser un dataset typé.
    Tout le monde ne travaille pas du des quantités de données suffisament petites pour pouvoir être gérées en mode déconnecté.

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Points : 2 203
    Points
    2 203
    Par défaut

    C'est vrai que c'était évident avant de voir écrit 6 millions...
    Faut se détendre un peu avant de sauter à la gorge...
    Tout le monde ne peut pas deviner qu'il parle de 6 millions avant qu'il le dise...

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Points : 2 203
    Points
    2 203
    Par défaut
    Enfin ce que j'en dis ...

    Si tu utilised un dataset;

    Si à la place de faire un select count(*) sur toute la table;

    Tu utilises un dataset dont la commande est :
    "Select * From matable where y=y"

    Peu de chance qeu te retrouves avec 6 M d'enregistrements dans ton set mais bref...

    Si ta table a des rows --> La ligne existe.
    Si "La ligne existe"
    SKIP
    Tu fais rien
    REPLACE
    tu édites le row; qui va changer d'état
    tu update le dataset (jusque la ligne concernée)
    THROW_EXCEPTION
    tu lances une exception
    Sinon,
    tu crée un row,
    tu peuple le datarow
    tu saves
    Fin
    Tu détruis le set

    Je vois pas trop où est la choucroute avec les 6 millions.
    C'est standard, ça marchera avec toutes les tables existantes,
    Ca te charge au pire quelques lignes


    Le dataset, ça peut servir à autre chose qu'un select étoile.
    Ca peut aussi faire office d'un équivalent de table temporaire qui t'empéche de t'enfermer dans le spécifique d'une base; surtout Oracle.

  9. #9
    Membre actif
    Inscrit en
    Juillet 2007
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 357
    Points : 280
    Points
    280
    Par défaut
    Merci b.af pour tes remarques.

    Dans mon cas j ai gardé l'architecture de depart a savoir

    une boucle

    while(l_oracledatareader.read())
    {
    .....
    }

    car l application est plus un traitement batch que autre chose.

Discussions similaires

  1. Réponses: 7
    Dernier message: 19/09/2014, 09h12
  2. Réponses: 12
    Dernier message: 05/11/2010, 17h58
  3. vérifier si une ligne existe, et lister les champs
    Par AIexis dans le forum Débuter
    Réponses: 15
    Dernier message: 27/12/2005, 21h06
  4. Réponses: 2
    Dernier message: 05/09/2005, 16h32
  5. Oracle 9i : Vérifier qu'une ligne existe
    Par Fatah93 dans le forum Oracle
    Réponses: 4
    Dernier message: 14/06/2005, 12h27

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