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

MS SQL Server Discussion :

[VB.NET] Curseur


Sujet :

MS SQL Server

  1. #1
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 270
    Points : 92
    Points
    92
    Par défaut [VB.NET] Curseur
    Bonjour,

    Je travaille avec SQL SERVER ET Visual Studio .NET.

    J'ai deux procédures stockées utilisant un curseur : la première pour l'ajout d'un enregistrement, la deuxième pour la modification. Dans chacune de ces deux requêtes, les curseurs sont utilisés de la même manière quasiment un copier coller.

    Mon problème est que lorsque le programme appelle deux fois la procédure stockée d'ajout .... pas de problème, mais lorsque je veux faire :

    modification ..... modification
    ou
    modification ..... ajout

    j'ai l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    le curseur ... existe déjà
    je vous donne l'utilisation du curseur dans la procédure de modification :

    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
     
     
    CREATE PROCEDURE TOTO
    	(
    		@x VARCHAR(2),
    		@y VARCHAR(2),
    	)
     
    AS
    	DECLARE VerifXY CURSOR FOR
    	SELECT x_toto, y_toto
    	FROM T_TOTO
    	WHERE id_toto = @idTOTO
     
    	DECLARE @verifX VARCHAR(2)
    	DECLARE @verifY VARCHAR(2)
     
    	BEGIN
    	          SET @verifX = (SELECT x_toto FROM T_TOTO WHERE id_toto = @idTOTO)
    	          SET @verifY = (SELECT y_toto FROM T_TOTO WHERE id_toto = @idTOTO)
     
    	           IF @verifX <> @x OR @verifY <> @y
    	           BEGIN
    	                  OPEN VerifXY
    		  FETCH NEXT FROM VerifXY INTO @verifX, @verifY
    		  WHILE @@FETCH_STATUS = 0
    		  BEGIN
    		           IF @x = @verifX AND @y = @verifY
    		           BEGIN
    		                SET @verif = 0
    		           END
        		           FETCH NEXT FROM VerifXY  INTO @verifX, @verifY
    		   END
     
    	                   CLOSE VerifXY
    	                   DEALLOCATE VerifXY
    	          END
     
                             .....
     
                 END
    GO

    donc comme e vous le disais, dans la procédure d'ajout c'est la même chose et avec elle je n'ai pas de problème, si quelqu'un a une idée

  2. #2
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 222
    Points : 19 551
    Points
    19 551
    Billets dans le blog
    25
    Par défaut
    Evitez les curseurs !
    Sinon fermez les et désallouez-les correctement.

    PS : dans votre exemple, ce que vous faites n'est pas très clair : on pourrait pas voir le vrai code ?
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

  3. #3
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 270
    Points : 92
    Points
    92
    Par défaut
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    -- 21/07/2005 (séparation entre tma et spot tma)
     
    -- B0_T_SPOT_TMA_UPDATE
    -- @idTMA : identifiant base de données du TMA concerné
    -- @idSpotTMA : identifiant base de données du spot tma concerné par la modification
    -- @x : position du spot sur l'abscisse du TMA
    -- @y : position du spot sur l'ordonnée du TMA
    -- @idUserUpdate : identifiant base de données de l'utilisateur à l'origine de la saisie
    -- @retour : identifiant généré
    -- @message : message d'erreur
     
    -- Procédure qui permet de modifier un spot de TMA
     
    CREATE PROCEDURE DBO.B0_T_SPOT_TMA_UPDATE
     
    	(
    		@idTMA INT,
    		@idSpotTMA INT,
    		@x VARCHAR(2),
    		@y VARCHAR(2),
    		@idUserUpdate INT,
    		@retour INT OUTPUT,
    		@message VARCHAR(255) OUTPUT
    	)
     
    AS
    	DECLARE @verif BIT
    	DECLARE @nb_verif  INT
    	DECLARE @bloc_verif  INT
     
    	DECLARE VerifXY CURSOR FOR
    	SELECT x_tma, y_tma
    	FROM T_SPOT_TMA
    	WHERE id_tma = @idTMA
     
    	DECLARE @verifX VARCHAR(2)
    	DECLARE @verifY VARCHAR(2)
     
    	BEGIN
    		SET @verif = 1
    		SET @message = ''
     
    		-- on vérifie que l'identifiant base de données du  tma existe bien
     
    		IF NOT EXISTS (SELECT * FROM T_TMA WHERE id_tma = @idTMA)
    		BEGIN
    			SET @verif = 0
    			SET @message = @message + 'Le TMA est inexistant.<br/>'
    		END
     
    		-- on vérifie que l'identifiant base de données du spot tma existe bien
     
    		IF NOT EXISTS (SELECT * FROM T_SPOT_TMA WHERE id_spot_tma = @idSpotTMA)
    		BEGIN
    			SET @verif = 0
    			SET @message = @message + 'Le spot est inexistant.<br/>'
    		END
     
    		-- on vérifie le nombre de spots par référence et par bloc donneur
     
    		SET @bloc_verif = (SELECT id_bloc FROM T_TECHNIQUE WHERE id_tech = (SELECT id_technique FROM T_SPOT_TMA WHERE id_spot_tma = @idSpotTMA))
     
    		SET @nb_verif = (SELECT count(id_spot_tma) FROM T_SPOT_TMA WHERE id_tma = @idTMA AND id_technique IN (SELECT id_tech FROM T_TECHNIQUE WHERE id_bloc = @bloc_verif))
    		IF @nb_verif >= 3
    		BEGIN
    			SET @message = @message + 'Il existe déjà au moins 3 spots provenant de ce bloc donneur sur ce TMA.<br/>'
    		END
     
    		-- on vérifie que l'identifiant base de données de l'utilisateur existe bien
     
    		IF NOT EXISTS (SELECT * FROM T_User WHERE id_user = @idUserUpdate)
    		BEGIN
    			SET @verif = 0
    			SET @message = @message + 'Utilisateur inconnu.<br/>'
    		END
     
    		-- on vérifie que la position n'est pas déjà prise sur le bloc receveur
     
    		SET @verifX = (SELECT x_tma FROM T_SPOT_TMA WHERE id_spot_tma = @idSpotTMA)
    		SET @verifY = (SELECT y_tma FROM T_SPOT_TMA WHERE id_spot_tma = @idSpotTMA)
     
    		IF @verifX <> @x OR @verifY <> @y
    		BEGIN
    			OPEN VerifXY
    			FETCH NEXT FROM VerifXY INTO @verifX, @verifY
    			WHILE @@FETCH_STATUS = 0
     
    				BEGIN
    					IF @x = @verifX AND @y = @verifY
    					BEGIN
    						SET @verif = 0
    						SET @message = @message + 'Position sur le TMA déjà utilisée.<br/>'
    					END
        					FETCH NEXT FROM VerifXY  INTO @verifX, @verifY
    				END
     
    			CLOSE VerifXY
    			DEALLOCATE VerifXY
    		END
     
    		IF @verif = 1
    		BEGIN
     
    			-- modification du spot de TMA
     
    			UPDATE T_SPOT_TMA
    			SET
    				id_tma = @idTMA,
    				x_tma = @x,
    				y_tma = @y,
    				id_user_update = @idUserUpdate,
    				dt_login_update = getDate()
    			WHERE id_spot_tma = @idSpotTMA
     
    			SET @retour = 1
    			SET @message = @message + 'Modification bien effectuée.<br/>'
    		END
    		ELSE
    		BEGIN
    			SET @retour = -1
    		END
    	END
    GO

  4. #4
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 222
    Points : 19 551
    Points
    19 551
    Billets dans le blog
    25
    Par défaut
    Et pourquoi pas, plus simpement (à vérifier mes conditions...)

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    CREATE PROCEDURE DBO.B0_T_SPOT_TMA_UPDATE
     
       (
          @idTMA INT,
          @idSpotTMA INT,
          @x VARCHAR(2),
          @y VARCHAR(2),
          @idUserUpdate INT,
          @retour INT OUTPUT,
          @message VARCHAR(255) OUTPUT
       )
     
    AS
       DECLARE @verif BIT
       DECLARE @nb_verif  INT
       DECLARE @bloc_verif  INT
       DECLARE @verifX VARCHAR(2)
       DECLARE @verifY VARCHAR(2)
     
       BEGIN
          SET @verif = 1
          SET @message = ''
     
          -- on vérifie que l'identifiant base de données du  tma existe bien
     
          IF NOT EXISTS (SELECT * FROM T_TMA WHERE id_tma = @idTMA)
          BEGIN
             SET @verif = 0
             SET @message = @message + 'Le TMA est inexistant.<br/>'
          END
     
          -- on vérifie que l'identifiant base de données du spot tma existe bien
     
          IF NOT EXISTS (SELECT * FROM T_SPOT_TMA WHERE id_spot_tma = @idSpotTMA)
          BEGIN
             SET @verif = 0
             SET @message = @message + 'Le spot est inexistant.<br/>'
          END
     
          -- on vérifie le nombre de spots par référence et par bloc donneur
     
          SET @bloc_verif = (SELECT id_bloc FROM T_TECHNIQUE WHERE id_tech = (SELECT id_technique FROM T_SPOT_TMA WHERE id_spot_tma = @idSpotTMA))
     
          SET @nb_verif = (SELECT count(id_spot_tma) FROM T_SPOT_TMA WHERE id_tma = @idTMA AND id_technique IN (SELECT id_tech FROM T_TECHNIQUE WHERE id_bloc = @bloc_verif))
          IF @nb_verif >= 3
          BEGIN
             SET @message = @message + 'Il existe déjà au moins 3 spots provenant de ce bloc donneur sur ce TMA.<br/>'
          END
     
          -- on vérifie que l'identifiant base de données de l'utilisateur existe bien
     
          IF NOT EXISTS (SELECT * FROM T_User WHERE id_user = @idUserUpdate)
          BEGIN
             SET @verif = 0
             SET @message = @message + 'Utilisateur inconnu.<br/>'
          END
     
          -- on vérifie que la position n'est pas déjà prise sur le bloc receveur
     
       if exists(SELECT x_tma, y_tma
       FROM T_SPOT_TMA
       WHERE id_tma = @idTMA
       AND id_spot_tma = @idSpotTMA
       AND x_tma <> y_tma
        AND x_tma = @x
         AND y_tma = @y)
          BEGIN
     
             -- modification du spot de TMA
     
             UPDATE T_SPOT_TMA
             SET
                id_tma = @idTMA,
                x_tma = @x,
                y_tma = @y,
                id_user_update = @idUserUpdate,
                dt_login_update = getDate()
             WHERE id_spot_tma = @idSpotTMA
     
             SET @retour = 1
             SET @message = @message + 'Modification bien effectuée.<br/>'
          END
          ELSE
          BEGIN
             SET @retour = -1
          END
       END
    GO
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

  5. #5
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 270
    Points : 92
    Points
    92
    Par défaut
    c'est en effet une solution, je vais essayer qqchose de ce genre, je reviens vers vous des que c'est testé

  6. #6
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 270
    Points : 92
    Points
    92
    Par défaut
    c'est parfait, merci encore pour votre aide !

    je vais faire le tour de mes prodédures stockées pour m'assurer que je n'ai pas utiliser d'autres curseurs inutilement

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

Discussions similaires

  1. [Débutant] wpf VB.net Curseur sous forme de gros rectangle
    Par SkaknYoshi dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 12/03/2014, 09h50
  2. [vs.net]curseur Textbox
    Par stgi02 dans le forum Visual Studio
    Réponses: 4
    Dernier message: 06/03/2010, 22h21
  3. [Vb.Net] - Curseur DataGridView
    Par Claude Robin dans le forum Windows Forms
    Réponses: 6
    Dernier message: 18/12/2007, 21h06
  4. [VB.NET] curseur de textbox
    Par AP dans le forum Windows Forms
    Réponses: 2
    Dernier message: 12/04/2006, 20h43
  5. [VB.NET] déplacer curseur
    Par Emcy dans le forum Windows Forms
    Réponses: 4
    Dernier message: 26/04/2005, 13h20

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