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

C# Discussion :

TransactionScope et transaction sous SQL Server 2005


Sujet :

C#

  1. #1
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 346
    Par défaut TransactionScope et transaction sous SQL Server 2005
    Bonjour,

    j'ai développé une WebMethod qui utilise une transaction:

    Code c# : 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
     
    using (TransactionScope scope = new TransactionScope())
    {
    	SqlConnection connection = null;
    	SqlCommand command = null;
     
    	[..] // Traitement
     
    	try
    	{
    		// Appel d'une procédure stockée utilisant une transaction
    		command.ExecuteNonQuery();
    	}
    	catch (Exception ex)
    	{
    		log.Error(ex.Message);		
    		throw new Exception("Erreur de sauvegarde dans la base de données.", ex);
    	}
     
    	trs.Complete();
     
    	[..] // Traitement
    }

    Comme vous le voyez cette WebMethod fait appel à une procédure stockée qui utilise aussi une transaction.
    Cette procédure stockée développée dans une base de données sous SQL Server 2005 est définie ci-dessous:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    CREATE PROCEDURE [dbo].[MyProcedure]
    (
    	-- Liste des paramètres
    )
    AS
     
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
    BEGIN TRANSACTION MyTransaction
     
    	-- Traitement
     
    COMMIT TRANSACTION MyTransaction

    Il arrive que l'exception avec le message suivant soit lancée par la base de données:

    La transaction distribuée est terminée. Inscrivez cette session, soit dans une nouvelle transaction, soit dans une transaction NULL.
    Que dois-je fais d'après vous pour corriger ce problème ?

    Merci d'avance,
    Zoax

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 109
    Par défaut
    La gestion de ta transaction est faite deux fois : en .Net et dans la procédure stockée.
    Si tu veux gérer ta transaction coté .Net enlève ton

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    BEGIN TRANSACTION MyTransaction
    COMMIT TRANSACTION MyTransaction

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 346
    Par défaut
    Bonjour,

    et merci pour la réponse.
    Si je retire la gestion de la transaction dans la procédure stockée, comment n'annuler que les modifications effectuées par la procédure si le traitement qu'elle réalise (impliquant plusieurs tables) échoue ?

    Merci d'avance
    ++

  4. #4
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Par défaut
    Mes amis, il ne faut jamais piloter les transactions côté client.
    Il ne faut pas gérer la transaction dans une procédure stockée si vous le fait déjà côté client.

    Faites donc votre choix !

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 346
    Par défaut
    Bonjour,

    et merci pour la réponse:

    Mes amis, il ne faut jamais piloter les transactions côté client.
    Il ne faut pas gérer la transaction dans une procédure stockée si vous le fait déjà côté client.
    Pour quelle raison ?

    J'ai manqué de précision dans la description de mon code. J'ai oublié une sauvegarde en base de données, raison pour laquelle j'ai utilisée une transaction dans cette méthode.
    Voici plus exactement la WebMethod que j'ai développée:

    Code c# : 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
     
    using (TransactionScope scope = new TransactionScope())
    {
    	SqlConnection connection = null;
    	SqlCommand command = null;
     
    	[..] // Traitement
     
    	try
    	{
    		// Appel d'une 1ère procédure stockée sauvegardant des données en base de données.
                    // Cette procédure n'utilise pas de transaction
    		command.ExecuteNonQuery();
    	}
    	catch (Exception ex)
    	{
    		log.Error(ex.Message);		
    		throw new Exception("Erreur de sauvegarde dans la base de données.", ex);
    	}
     
    	[..] // Traitement
     
    	try
    	{
    		// Appel d'une 2ème procédure stockée sauvegardant des données en base de données
                    // Cette procédure utilise une transaction
    		command.ExecuteNonQuery();
    	}
    	catch (Exception ex)
    	{
    		log.Error(ex.Message);		
    		throw new Exception("Erreur de sauvegarde dans la base de données.", ex);
    	}
     
    	trs.Complete();
     
    	[..] // Traitement
    }

    J'ai utilisée une transaction dans cette WebMethod pour qu'en cas d'échec pouvoir revenir à l'état initial à tout moment. Par exemple, si la sauvegarde des données en base de données échoue lors de l'appel de la deuxième procédure, les données avant l'appel de la première procédure doivent être restaurée dans la base de données.

    J'ai ensuite utilisée une transaction dans la deuxième procédure pour qu'en cas d'échec du traitement réalisé (modifiant plusieurs tables), l'état initial soit restauré.

    Merci d'avance pour votre aide.
    ++

  6. #6
    Membre émérite
    Avatar de shwin
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    568
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2003
    Messages : 568
    Par défaut
    Citation Envoyé par WOLO Laurent Voir le message
    Mes amis, il ne faut jamais piloter les transactions côté client.
    Tu peux m'expliquer ? Si jai une méthode client qui créé un fichier et qui appel le serveur pour faire une mise a jours dans la DB. Je vais forcément utiliser la transactionScope coté client

    Citation Envoyé par zoaax Voir le message
    J'ai utilisée une transaction dans cette WebMethod pour qu'en cas d'échec pouvoir revenir à l'état initial à tout moment. Par exemple, si la sauvegarde des données en base de données échoue lors de l'appel de la deuxième procédure, les données avant l'appel de la première procédure doivent être restaurée dans la base de données.

    J'ai ensuite utilisée une transaction dans la deuxième procédure pour qu'en cas d'échec du traitement réalisé (modifiant plusieurs tables), l'état initial soit restauré.
    ++
    Si tu utilise le transactionScope, ne t'occupe pas des transaction dans les SP meme si tu utilise plusieur table. Les modifications ne sont que 'commité' que quand tu va faire Commit() sur le scope.

  7. #7
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 346
    Par défaut
    Bonjour,

    suite à vos remarques, j'ai supprimé la transaction dans la procédure stockée.
    Malgré ça j'ai encore obtenu le même message d'erreur.

    ++

  8. #8
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 346
    Par défaut
    Bonjour,

    je me permets de vous recontacter car le problème persiste. Comme je le disais dans le message précédent, j'ai supprimé la transaction dans la procédure stockée suite aux remarques que vous m'aviez faite.

    Merci d'avance pour votre aide.
    ++

  9. #9
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Par défaut
    Désolé, j'étais en vancance de fin d'année.
    Citation Envoyé par zoaax Voir le message
    Bonjour,
    Pour quelle raison ?
    Qu'est ce qui se passe si votre poste client s'arrête avant de valider la transaction ?
    La réponse est : Et probablement un plantage des processus qui attendent la libération des ressources immobilisées par ta transactionscope.

    Citation Envoyé par zoaax Voir le message
    Bonjour,
    Code c# : 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
     
    using (TransactionScope scope = new TransactionScope())
    {
    	SqlConnection connection = null;
    	SqlCommand command = null;
     
    	[..] // Traitement
     
    	try
    	{
    		// Appel d'une 1ère procédure stockée sauvegardant des données en base de données.
                    // Cette procédure n'utilise pas de transaction
    		command.ExecuteNonQuery();
    	}
    	catch (Exception ex)
    	{
    		log.Error(ex.Message);		
    		throw new Exception("Erreur de sauvegarde dans la base de données.", ex);
    	}
     
    	[..] // Traitement
     
    	try
    	{
    		// Appel d'une 2ème procédure stockée sauvegardant des données en base de données
                    // Cette procédure utilise une transaction
    		command.ExecuteNonQuery();
    	}
    	catch (Exception ex)
    	{
    		log.Error(ex.Message);		
    		throw new Exception("Erreur de sauvegarde dans la base de données.", ex);
    	}
     
    	trs.Complete();
     
    	[..] // Traitement
    }
    C'est la transactionscope qu'il faut éliminer plutôt que supprimer les transaction dans la SP.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE PROCEDURE PROCGENERAL
    AS
    BEGIN TRANSACTION
           EXEC PROC1
           EXEC PROC2
    COMMIT
    Bien sûr qu'il ne s'agit là que d'un model.

    Il ne vous restera que jouer cette SP depuis un code client C#

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  10. #10
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 346
    Par défaut
    Bonjour,

    Vous me conseillez de ne pas utiliser TransactionScope mais plutôt une procédure stockée. L'inconvénient d'une procédure stockée est qu'il n'est pas possible à ma connaissance d'y passer des paramètres de n'importe quel type de données comme des tableaux de valeur ou des types plus complexes.
    J'utilise SQL Server 2005. Pensez-vous que je devrais utiliser une procédure stockée managée ?

    Merci d'avance,
    ++

  11. #11
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Par défaut
    Il se pourrait que vous n'ayez pas besoin d'utiliser une procedure stockée managée.
    Est ce que vous pouvez me dire exactement ce que font tes deux SP ?
    Au besoin, poste le code de ces SP et je pourais te dire quoi faire.

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  12. #12
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 346
    Par défaut
    Bonjour,

    grosso modo, j'ai dans la base de données le modèle suivant:

    Groupe <-> Capteurs
    Un capteur est rattaché à un groupe (de capteurs).

    La 1ère SP insère un groupe dans la base de données.
    La 2ème SP insère un capteur dans la base de données.

    Le WebService génère les groupes puis appelle la 1ère SP autant de fois qu'il y a de groupe.
    Puis, le webservice génère les capteurs puis appelle la 2ème SP autant de fois qu'il y a de capteurs.

    En espérant que cela vous aide à m'aider.

    ++

  13. #13
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Par défaut
    Et pourqoui ne pas générer ces groupes et ces capteurs depuis une procédure stockée ?

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  14. #14
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 346
    Par défaut
    Bonjour,

    Le web service génère les groupes et capteurs à partir d'objets contenus dans des collections .NET (dictionnaires, listes génériques...)
    J'avais procédé ainsi car il me semblait qu'il n'était pas possible de passer une collection en paramètre d'une procédure stockée.
    Comment faire pour passer par exemple un tableau de valeur en paramètre d'une procédure stockée ?

    Merci d'avance,
    ++

  15. #15
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Par défaut
    Tu as toujours la possibilité de passer par les SPs managées mais ce n'est pas mon objectif, ce n'est pas plus rapide que le T/SQL.
    Est ce que tu peux me poster ton code ou encore ton algorithme ?

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  16. #16
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 346
    Par défaut
    Bonjour,

    je vous joins le code du WebService:

    Code c# : 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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
        /// <summary>
        /// Génération des groupes et des capteurs associés
        /// </summary>
        [WebMethod(Description = "Génération des groupes et des capteurs associés")]
        public void GenerateGroupAndCapteur(Dictionary<string, Group> groupsAndCapteurs)
        {
            IGroupDAO groupDAO = GroupDAO.GetInstance();
            ICapteurDAO capteurDAO = CapteurDAO.GetInstance();
     
            try
            {
                using (TransactionScope trs = new TransactionScope())
                {
                    // Génération des groupes
                    using (DSGroupes.GroupesDataTable dtGrp = new DSGroupes.GroupesDataTable())
                    using (DSCapteurs.CapteursDataTable dtCpt = new DSCapteurs.CapteursDataTable())
                    {
                        // Parcourt tous les groupes à générer
                        foreach (KeyValuePair<string, Group> valPair in groupsAndCapteurs)
                        {
                            // Groupe associé au CodeBarre
                            Group grp = valPair.Value;
                            // Chargement dans la base de données du groupe correspondant au code-barre
                            groupDAO.LoadGroupByCodeBarre(dtGrp, valPair.Key);
     
                            // Vérifie si le groupe associé au code barre a été trouvé dans la base de données
                            DataRow[] grpRow = dtGrp.Select(string.Format("GPC_CODEBARRE = '{0}'", valPair.Key));
                            // Groupe à ajouter ou chargé dans la base de donnés
                            DSGroupes.GroupesRow grpAdding = null;
                            if (grpRow.Length == 0)
                            {
                                // Cas où le groupe n'appartient pas à la base de données -> Génération du groupe
                                // Ajout du groupe au DataSet
                                grpAdding = dtGrp.AddGroupesRow(grp.Nom, string.Empty, true, valPair.Key);
                                // Sauvegarde de la datatable dans la base de données
                                groupDAO.SaveGroup(dtGrp);
                                // Validation des modifications du datatable
                                dtGrp.AcceptChanges();
                            }
                            else
                                // Cas où le groupe appartient à la base de données
                                grpAdding = (DSGroupes.GroupesRow)grpRow[0];
     
                            // Génération des capteurs
                            // Crée les capteurs rattachés au groupe
                            for (int i = 0; i < grp.NombreVoie; i++)
                            {
                                // Initialisation de l'opérande
                                string operande = string.Format("{0}{1}.{2}", grp.TypeOperande, grp.StartAdresse, i);
     
                                dtCpt.AddCapteursRow("Capteur" + operande, "Capteur du groupe " + grp.Nom, "", grp.Operande, true, grpAdding.GPC_ID);
                            }
                        }
     
                        // Sauvegarde de la DataTable des capteurs dans la base de données
                        capteurDAO.SaveCapteur(dtCpt);
                        // Validation des modifications du datatable
                        dtCpt.AcceptChanges();
                    }
     
                    trs.Complete();
                }
            }
            catch (Exception ex)
            {
                log.Error("Erreur lors de la génération des groupes et des capteurs", ex);
                throw new SoapException("Erreur lors de la génération des groupes et des capteurs", XmlQualifiedName.Empty);
            }
        }

    et le code de la 1ère SP:

    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.CreateGroupe
    (
    	@GPC_NOM char(32),
    	@GPC_DESCRI varchar(128),
    	@GPC_ACTIF bit,
    	@GPC_CODEBARRE char(16)
    )
    AS
    	SET NOCOUNT OFF;
    INSERT INTO [T_GROUPES_CAPTEURS_GPC] ([GPC_NOM], [GPC_DESCRI], [GPC_ACTIF], [GPC_CODEBARRE]) VALUES (@GPC_NOM, @GPC_DESCRI, @GPC_ACTIF, @GPC_CODEBARRE);
     
    SELECT GPC_ID, GPC_NOM, GPC_DESCRI, GPC_ACTIF, GPC_CODEBARRE FROM T_GROUPES_CAPTEURS_GPC WHERE (GPC_ID = SCOPE_IDENTITY())

    et celui de la 2ème SP:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ALTER PROCEDURE dbo.CreateCapteur
    (
    	@CPT_NOM char(32),
    	@CPT_DESCRI varchar(128),
    	@CPT_LIBELLE varchar(32),
    	@CPT_OPERANDE char(8),
    	@CPT_ACTIF bit,
    	@GPC_ID int
    )
    AS
    	SET NOCOUNT OFF;
    INSERT INTO [T_CAPTEURS_CPT] ([CPT_NOM], [CPT_DESCRI], [CPT_LIBELLE], [CPT_OPERANDE], [CPT_ACTIF], [GPC_ID]) VALUES (@CPT_NOM, @CPT_DESCRI, @CPT_LIBELLE, @CPT_OPERANDE, @CPT_ACTIF, @GPC_ID);
     
    SELECT CPT_ID, CPT_NOM, CPT_DESCRI, CPT_LIBELLE, CPT_OPERANDE, CPT_ACTIF, GPC_ID FROM T_CAPTEURS_CPT WHERE (CPT_ID = SCOPE_IDENTITY())

    En espérant que cela vous aide à m'aider.
    ++

  17. #17
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach (KeyValuePair<string, Group> valPair in groupsAndCapteurs);
    Et quelle est la définition de la classe Group ?

    Merci pour les précisions.

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  18. #18
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 346
    Par défaut
    Bonjour,

    voici le code de la classe Groupe:

    Code c# : 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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
     
        public class Group : ICodeBarreObject
        {
            #region Propriétés
     
            // Nom du groupe
            private string m_Nom;
            /// <summary>
            /// Obtient ou définit le nom du groupe
            /// </summary>
            public string Nom
            {
                get { return m_Nom; }
                set { m_Nom = value; }
            }
     
            /// <summary>
            /// Nombre de voie associée au groupe
            /// </summary>
            private int m_NombreVoie;
            /// <summary>
            /// Obtient ou définit le nombre de voie associée au groupe
            /// </summary>
            public int NombreVoie
            {
                get { return m_NombreVoie; }
                set { m_NombreVoie = value; }
            }
     
            /// <summary>
            /// Type d'opérande
            /// </summary>
            private string m_TypeOperande;
            /// <summary>
            /// Obtient ou définit le type d'opérande
            /// </summary>
            public string TypeOperande
            {
                get { return m_TypeOperande; }
                set { m_TypeOperande = value; }
            }
     
            /// <summary>
            /// Adresse de début
            /// </summary>
            private short m_StartAdresse;
            /// <summary>
            /// Obtient ou définit l'adresse de début
            /// </summary>
            public short StartAdresse
            {
                get { return m_StartAdresse; }
                set { m_StartAdresse = value; }
            }
     
            #endregion
     
            #region ICodeBarreObject Membres
     
            /// <summary>
            /// Code barre
            /// </summary>
            private string m_CodeBarre;
            /// <summary>
            /// Obtient ou définit le code-barre
            /// </summary>
            public string CodeBarre
            {
                get { return m_CodeBarre; }
                set { m_CodeBarre = value; }
            }
     
            #endregion
        }

    Je me suis aperçu qu'il y avait une erreur dans le code remis précédemment à la ligne:

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    dtCpt.AddCapteursRow("Capteur" + operande, "Capteur du groupe " + grp.Nom, "", grp.Operande, true, grpAdding.GPC_ID);

    J'ai remplacé grp.Operande par operande. Cette valeur est déterminée précédemment:

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    dtCpt.AddCapteursRow("Capteur" + operande, "Capteur du groupe " + grp.Nom, "", operande, true, grpAdding.GPC_ID);

    Pour informations, le principe de fonctionnement est le suivant:
    - l'utilisateur scanne à l'aide d'un petite terminal mobile le code-barre collé sur un rack d'entrées/sorties. Le code-barre est une suite de caractères constitué du code-barre du groupe à 16 caractères, du nom du groupe, du nombre de voie, du type d'opérande (s'il s'agit d'une entrée ou d'une sortie) et de l'adresse de début. Ces informations sont déterminées par l'applicatif mobile du terminal et affichées.
    Lorsque l'opérateur a terminé le scan de plusieurs rack (ou groupe), il valide et l'applicatif fait appel au webservice décrit précédemment.

    Merci encore
    ++

  19. #19
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 346
    Par défaut
    Bonjour,

    je me permets de relancer le post.
    Quelqu'un a-t-il une idée ?

    Merci d'avance,
    ++

  20. #20
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 346
    Par défaut
    Bonjour,

    est-ce que vous pensez que je dois créer une procédure stockée managée ?
    Est-ce que je dois mettre ma transaction dans la SP de la base de données ?
    Sinon comment puis-je faire selon vous pour corriger mon problème ?

    Merci d'avance,
    ++

Discussions similaires

  1. [Requete] probleme de synthaxe sous SQL SERVER 2005
    Par sanosuke dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 14/05/2007, 11h24
  2. Création d'un cube sous Sql Server 2005
    Par Valentino62100 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 16/04/2007, 09h42
  3. Acces concurrentiel sous sql server 2005
    Par Marco77 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 07/02/2007, 15h53
  4. Réponses: 1
    Dernier message: 13/12/2006, 14h18
  5. Importé un fichier excel sous SQL Server 2005
    Par summer91 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 01/05/2006, 10h52

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