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

Développement SQL Server Discussion :

Assembly - Requetes imbriquees


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    54
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2009
    Messages : 54
    Par défaut Assembly - Requetes imbriquees
    Bonjour à vous,

    je ne trouve pas de solution claire au problème de requetes imbriquées et utilisation d'une seule connection SQL Server par un assembly (C#).

    Cas d'étude: Je code un assembly qui effectue un Select. Pour chaque ligne de ce Select il doit effectuer un autre Select. Pour chaque ligne de ce nouveau Select il effectue un update.

    Lorsque j'utilise ma connection de contexte, je récupère le message "Connexion déjà utilisée" ou "Reader déjà ouvert" ... et sauf copier tous les résultats dans un tableau et fermer les reader ou connection pour pouvoir les réutiliser, je ne vois pas trop éviter ce problème. La connection ne peut-elle supporter qu'un seul select à la fois ?

    Nota: J'ai déclaré pour chaque select un Reader distinct, mais cela ne règle pas le probleme, je récupère une erreur du genre "un Reader utilise déjà cette connection ...etc".

    Existe-t-il une solution 'dynamique' à ce problème qui permette donc d'exploiter en boucle les résultats retournés par une requête ?

    Merci pour tout réponse.

  2. #2
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Bonsoir,

    Que voulez vous faire exactement avec votre assembly ? Quelle est la finalité ?

    Sachez que le langage SQL est plus adapté pour ce genre d'opérations. Les assembly sont plus performantes pour certaines opérations bien précises...

    ++

  3. #3
    Membre averti
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    54
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2009
    Messages : 54
    Par défaut
    Bonjour,

    je souhaite gérer des exports de tables avec des dépendances. Donc je lis ma table A et pour toute ligne de A je dois chercher des enregistrements dans une table B et en fonction des valeurs de B cela donne un insert dans une table C. J'ai donc écris un assembly qui déclare une procédure stockée et cette procédure utilise des fonctions de lecture et d'écriture. Cependant je fais ceci:

    pour tout A
    {Lire B
    Pour tout B
    {
    insert dans C
    }
    }
    Donc je me retrouve avec plusieurs Reader en même temps, je n'ai pas le choix et une consolidation des requetes A et B n'est pas envisageable car il y a de nombreux tests (peu faisables avec du SQL) entre le choix des lignes de B et la création des lignes de C.

    Merci.

  4. #4
    Membre averti
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    54
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2009
    Messages : 54
    Par défaut
    La véritable question c'est : est-il dans mon cas obligatoire de déclarer des listes selon:
    Select A -> recopier les lignes obtenues dans liste A, fermer le Reader
    Select B (dépend des valeurs de Liste A) -> recopier les lignes obtenues dans liste B, fermer le Reader
    Tests sur valeurs obtenues dans liste B et inserts dans table C avec des valeurs de liste A et de liste B.

    Merci.

  5. #5
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Vous êtes dans votre cas obligé de fermer à chaque fois votre reader.
    Vous allez devoir en effet gérer vos différentes listes pour gérer vos conditions etc ....

    Avez vous envisagé de faire cela via SSIS qui permet de faire exactement ce que vous voulez et de façon assez simple ? (avec les boucles ForEach ...)

    ++

  6. #6
    Membre averti
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    54
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2009
    Messages : 54
    Par défaut
    C'est bien ce que je pensais.

    Ce que j'ai fait, j'ai reproduis le modèle de donnée sous forme de classe: pour chaque table sur laquelle je souhaite travailler j'ai créé 2 classes: la première C1 contient la définition de mes champs et des accesseurs. La seconde est une List<C1> qui gère mes lignes. J'effectue mes select, le stocke dans l'objet, je ferme les Reader.

    Pour tester et déployer je me contente de compiler mon assembly et de recréer ma procédure stockée dans SQL Server. Je ne suis pas si loin que cela dans la compréhension des termes ... et je ne sais pas du coup si j'utilise ce qui se nomme SSIS ou pas ... j'imagine que non.

    En tout cas merci pour la confirmation.
    C'est résolu

    Au passage, j'ai rencontré des petits problèmes avec les Transactions ... problème que j'ai résolu, mais pas bien compris, j'explique:

    J'effectue 1 select, 1 update, 1 select, 1 update dans cet ordre. Si je ne déclare pas l'objet Transaction dans les objet SqlCommand associés aux selects, je récupère une erreur, alors que je déclare les Transactions pour ce qui évolue vraiment, à savoir les update ... bref, j'ai donc instancié mes objets SqlCommand avec l'objet Transaction en dernier paramètre pour tout le monde et je n'ai plus d'erreur ... une explication ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 26/04/2006, 14h36
  2. [VBnet][Access] Requete imbriquee "insert + select"
    Par Fab62_ dans le forum Windows Forms
    Réponses: 3
    Dernier message: 06/03/2006, 13h58
  3. requete imbriquee
    Par pascale86 dans le forum Requêtes
    Réponses: 6
    Dernier message: 23/09/2005, 15h10
  4. [REQUETE][IMBRIQUEE] Bien ou pas bien?
    Par fabszn dans le forum Langage SQL
    Réponses: 31
    Dernier message: 21/04/2005, 10h57
  5. PROBLEME DE REQUETE IMBRIQUEE
    Par fleuve007 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 31/12/2003, 15h33

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