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 :

Accès à une table temporaire dans du code C#


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 111
    Points : 44
    Points
    44
    Par défaut Accès à une table temporaire dans du code C#
    Bonjour

    J'ai créé au sein d'une procédure stockée Fill_Tempo une table temporaire globale ##tableTemp. Voici mon code :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ALTER PROCEDURE [dbo].[Fill_Tempo]
    AS
    BEGIN
    	create table ##tableTemp(donneesGeog GEOGRAPHY)
    	DECLARE @geom GEOGRAPHY
            /* Va chercher les données à stocker dans @geom, grâce à
            la fonction get_Geom_WKT_WKB() */
    	SET @geom = dbo.get_Geom_WKT_WKB()
    	insert into ##tableTemp values (@geom)
    	select * from ##tableTemp
    END

    Ensuite, dans mon code C#, je souhaite récupérer les données de la table temporaire ##tableTemp. Cette dernière ne contient qu'une ligne, et un seul champ :

    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
     
    // Créer une commande sql
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = con;
                    cmd.CommandText = "SELECT * FROM ##tableTemp";
                    cmd.CommandTimeout = 1000;
     
                    // Ouvrir la connexion
                    con.Open();
     
                    // Récupérer les données dans le dataset
                    //SqlDataAdapter sda = new SqlDataAdapter();
                    //sda.SelectCommand = cmd;
                    //DataSet data = new DataSet();
                    //sda.Fill(data);
    Il me pose problème sur la dernière ligne, en me disant que la table ##tableTemp n'existe pas...

    Comment je peux faire pour pouvoir accéder à cette table dans mon code C#???

  2. #2
    Expert éminent sénior
    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 : 45
    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
    Points : 12 891
    Points
    12 891
    Par défaut
    Bonjour,

    Pourquoi passez vous par une table temporaire globale ?

    Est ce qu'il ne serait pas plus simple d'exploiter directement le résultat de votre procédure par un datareader ?

    ++

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 111
    Points : 44
    Points
    44
    Par défaut
    J'avais penser à faire ça aussi, mais mon maître de stage ma conseillé de passer par une table temporaire pour ne pas avoir à effectuer la procédure plusieurs fois (car le temps d'exécution de la proc stock est plutôt (très) long!)
    Mais je remarque que cela ne fonctionne que dans un cas :

    Si je laisse (sous ms sql manager studio) la fenêtre d'exécution de la proc stock ouverte :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    USE [Test]
    GO
    DECLARE	@return_value int
    EXEC	@return_value = [dbo].[Fill_Tempo]
    SELECT	'Return Value' = @return_value
    GO

    Il sait retrouver dans mon code C# ma table ##tableTemp...
    Par contre, dès que je ferme la fenêtre d'exécution, la ##tableTemp est supprimée et dans mon code C# j'ai l'erreur que j'ai cité dans mon message précédent...

  4. #4
    Expert éminent sénior
    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 : 45
    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
    Points : 12 891
    Points
    12 891
    Par défaut
    Il sait retrouver dans mon code C# ma table ##tableTemp...
    Par contre, dès que je ferme la fenêtre d'exécution, la ##tableTemp est supprimée et dans mon code C# j'ai l'erreur que j'ai cité dans mon message précédent...
    Ce qui est normal ...

    Comment allez vous utiliser votre procédure précisemment ?
    Dans quels cas allez vous la rappeler ? On pourra peut être vous aider sur la démarche ...

    ++

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 111
    Points : 44
    Points
    44
    Par défaut
    J'ai résolu mon problème,
    Au lieu de créer une table temporaire, je créé une table fixe, que je ne rempli qu'une fois, et à partir de laquelle il sera beaucoup plus simple d'accéder aux données, par simple requête SELECT

  6. #6
    Expert éminent sénior
    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 : 45
    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
    Points : 12 891
    Points
    12 891
    Par défaut
    Effectivement une table de travail peut être une solution.

    ++

  7. #7
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    J'explique ici pourquoi l'utilisation de tables temporaires est contre-performante.

    Peut-être devriez-vous penser à optimiser les requêtes de la procédure stockée, de sorte qu'elle s'exécute rapidement.
    Avez-vous et/ou votre maître de stage observé le plan des différentes requêtes qui sont dans la procédure stockée ?
    Il se peut même par là que vous n'ayez à l'exécuter qu'une seule fois ...

    @++

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 111
    Points : 44
    Points
    44
    Par défaut
    Oui nous avons regardé, la requête ne porte que sur un champ d'une table.
    J'ai un curseur qui parcours les lignes de la table, et à chaque passage, ce champ est cumulé sur une variable, à la fin il renvoie la valeur de la variable, et la stocke dans la table.
    Le souci est que la table sur laquelle est positionné le curseur contient énormément de données, donc beaucoup de ligne à parcourir...
    Un index a déjà été posé sur le champ de la table considéré.
    auriez-vous une autre idée pour optimiser le temps d'exécution?

  9. #9
    Expert éminent sénior
    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 : 45
    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
    Points : 12 891
    Points
    12 891
    Par défaut
    auriez-vous une autre idée pour optimiser le temps d'exécution?
    Oui en supprimant cet affreux curseur !!

    Il n'y a pas besoin de curseur pour cumuler une valeur d'une colonne dans une variable...

    Votre index ne sera pas pris en compte si vous parcourez l'ensemble de votre table.

    Pouvez vous nous mettre le code utilisé par votre procédure stockée ?

    ++

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

Discussions similaires

  1. Insertion des enregistrements d'une table temporaire dans un état
    Par Chayanne47 dans le forum Composants VCL
    Réponses: 4
    Dernier message: 18/04/2008, 11h46
  2. [MySQL] Annoncer une table vide dans du code PHP
    Par bilou95 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 20/11/2007, 09h37
  3. Impossible de créer une table temporaire dans une fonction
    Par bossun dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 05/10/2007, 10h03
  4. Réponses: 5
    Dernier message: 03/08/2007, 12h52
  5. Réponses: 8
    Dernier message: 06/06/2007, 17h03

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