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 :

l'option MultipleActiveResultSets=True fonctione t elle avc "context connection=true"


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 16
    Points : 14
    Points
    14
    Par défaut l'option MultipleActiveResultSets=True fonctione t elle avc "context connection=true"
    Bonjour tout le monde !
    cela fait un peu plus de 3 jours que j'ai un bug. j'ai une petite théorie mais je voudrais une confirmation de votre part, ou bien un infirmation (avec une solution ca serait génial), ou sinon merci quand même.

    en fait je suis entrain de programmer une procédure stockée en c# (elle trop compliquée, pour l'expliquer) mais je donne un exemple d'illustration de mon bug.

    j'ai cette proceddure stockée en c#
    qui est compilable en .NET 2.0 et deployable dans SQLSERVER 2005 sans aucune erreur
    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
     
    [Microsoft.SqlServer.Server.SqlProcedure]
        public static void toto()
        {
            using (SqlConnection MARSconnection = new SqlConnection("context connection=true"))
            {
                MARSconnection.Open();
                SqlCommand comm = MARSconnection.CreateCommand();
                comm.CommandType = CommandType.Text;
                comm.CommandText = "SELECT TOP 10 [ImageFileName] FROM [media_content].[dbo].[resultHistoColor0G1Z6]";
                using (SqlDataReader reader = comm.ExecuteReader())
                {
                    while (reader.Read())
                    {
                    }
                }
     
                comm = MARSconnection.CreateCommand();
                comm.CommandType = CommandType.Text;
                comm.CommandText = "SELECT TOP 10 [ImageFileName] FROM [media_content].[dbo].[resultHistoColor0G1Z6]";
                using (SqlDataReader reader1 = comm.ExecuteReader())
                {
                    while (reader1.Read())
                    {
                    }
     
                    SqlCommand comm1 = MARSconnection.CreateCommand();
                    comm1.CommandType = CommandType.Text;
                    comm1.CommandText = "CREATE TABLE [dbo].[tete]( [im_RecordID] [varchar](17) NULL)";
                    comm1.ExecuteNonQuery();
                }
                MARSconnection.Close();
            }
        }

    Le code ci dessus produit l'erreur suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Une erreur .NET Framework s'est produite au cours de l'exécution de la routine ou de la fonction d'agrégation définie par l'utilisateur 'toto'*: 
    System.InvalidOperationException: There is already an open DataReader associated with this Command which must be closed first.
    System.InvalidOperationException: 
       at System.Data.SqlClient.SqlInternalConnectionSmi.ValidateConnectionForExecute(SqlCommand command)
       at System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(String method, SqlCommand command)
       at System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async)
       at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)
       at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
       at Kmeans_SP.toto()
    les paramètres de connexion connectionString (définit au niveau des propriétés du projet contenant cette procédure stockée) sont valides (equivalent à celles du programme ci dessous). je souligne qu'il y a l'option MultipleActiveResultSets=True.

    Or cette procedure stockée je l'ai implenté sous forme d'un programme "application console" en c#. elle fonctionne parfaitement. le programme est le suivant:

    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
     
    using System;
    using System.Data.SqlClient;
    using System.Data;
     
    namespace testTypes
    {
        class Program
        {
            static void Main(string[] args)
            {
                String ConnectionString =
                "MultipleActiveResultSets=True;" +
                "Data Source=THESE\\SQLSERVER;Initial Catalog=media_content" +
                ";Persist Security Info=False;Integrated Security=SSPI;";
     
                using (SqlConnection MARSconnection = new SqlConnection(ConnectionString))
                {
                    MARSconnection.Open();
                    SqlCommand comm = MARSconnection.CreateCommand();
                    comm.CommandType = CommandType.Text;
                    comm.CommandText = "SELECT TOP 10 [ImageFileName] FROM [media_content].[dbo].[resultHistoColor0G1Z6]";
                    using (SqlDataReader reader = comm.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                        }
                    }
     
                    comm = MARSconnection.CreateCommand();
                    comm.CommandType = CommandType.Text;
                    comm.CommandText = "SELECT TOP 10 [ImageFileName] FROM [media_content].[dbo].[resultHistoColor0G1Z6]";
                    using (SqlDataReader reader1 = comm.ExecuteReader())
                    {
                        while (reader1.Read())
                        {
                        }
     
                        SqlCommand comm1 = MARSconnection.CreateCommand();
                        comm1.CommandType = CommandType.Text;
                        comm1.CommandText = "CREATE TABLE [dbo].[tete]( [im_RecordID] [varchar](17) NULL)";
                        comm1.ExecuteNonQuery();
                    }
                    MARSconnection.Close();
                }
     
                Console.WriteLine("good");
                Console.ReadKey();
            }
        }
    }
    je signale que les paramètres de connexion du programme doivent contenir l'option MultipleActiveResultSets=True pour être en mesure de s'exécuter (MARS).

    les paramètres de connexion sont exactement les mêmes.
    donc ce qui m'induis à conclure que l'option MultipleActiveResultSets=True ne fonctionne que si le programme ne s'exécute pas au niveau du serveur mais à l'exterieure.

    qu'est ce que vous en pensez ?

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 869
    Points : 53 028
    Points
    53 028
    Billets dans le blog
    6
    Par défaut
    SQL Server n'étant pas un outil d'IHM l'utilisation de MARS au sein d'une proc stock CLR n'a aucun intérêt et ne doit par conséquent pas être géré.

    A +

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 16
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    SQL Server n'étant pas un outil d'IHM l'utilisation de MARS au sein d'une proc stock CLR n'a aucun intérêt et ne doit par conséquent pas être géré.
    merci pour votre réponse ! vous confirmez mes soupçons.
    Le plus proche que j'ai trouvé en parlant de ce sujet est http://blogs.msdn.com/irenak/archive...sing-mars.aspx
    mais bon dans la doc sur MSDN ce n'est pas très clair!


    Dans ce cas, je suis obligé d'implanter mon programme sous forme comme projet "console application".

    j'ai développé une série de procédures stockées, et celui la je ne pourrait pas le déployer sur le serveur. Du coup, les utilisateurs ne pourront pas exécuter ce programme au niveau du serveur. Finalement , j'ai peut être trouvé une utilité à cette propriété.

    remarque : j'ai une version de ce programme sous forme de procédure stockée (au lieu de passer par le "context connection=true" je crée une une SQLconnection en definissant explisitement les propriétés de la connexion "Data Source","Initial Catalog", etc.) , elle se déploie sans erreur , mais il n'est possible de l'executer qu'en mode debug.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 869
    Points : 53 028
    Points
    53 028
    Billets dans le blog
    6
    Par défaut
    Vous ne devez en aucun cas faire ce genre de chose. Soit la proc stock que vous voulez faire a des interactions avec des utilisateurs auquel cas il est interdit de le faire, soit elle n'en a pas et donc pas besoin de MARS.

    A +

Discussions similaires

  1. Réponses: 6
    Dernier message: 01/06/2007, 17h39
  2. une fonction peut elle etre répétée indefiniment ?
    Par bilou95 dans le forum Général JavaScript
    Réponses: 39
    Dernier message: 25/05/2007, 13h51
  3. [XML fonctions] Existent - elles?
    Par Jean_Benoit dans le forum Oracle
    Réponses: 2
    Dernier message: 10/06/2006, 20h35
  4. Une fonction peut-elle retourner plusieurs résultats ?
    Par aragorns dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 26/03/2005, 22h18
  5. Réponses: 5
    Dernier message: 25/11/2003, 10h02

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