Recuperer 1 variable dans un trigger (C#) [Résolu]

bootchoz 88 Messages postés mardi 3 mai 2005Date d'inscription 17 septembre 2006 Dernière intervention - 9 juin 2006 à 10:07 - Dernière réponse : crilun 114 Messages postés lundi 10 mai 2004Date d'inscription 17 octobre 2006 Dernière intervention
- 16 juin 2006 à 13:23
bonjour,
je debute en c# et je n'arrive pas a recuperer la valeur d'une variable @id_pers pour l'inserer dans une table via un trigger.
voici le code de ma page .aspx
<

asp:SqlDataSourceID="SqlDataSource1"runat="server"ConnectionString="<%$ ConnectionStrings:projetConnectionString1 %>
"
InsertCommand
="INSERT INTO [personne] ([wwid_pers], [nom_pers], [id_resp]) VALUES (@wwid_pers, @nom_pers, @id_resp)"
ProviderName="<%$ ConnectionStrings:projetConnectionString1.ProviderName %>
"
SelectCommand
"SELECT personne.id_pers, [wwid_pers], [nom_pers], [id_resp] FROM [personne], [fonction], [a_com_fonc] WHERE fonction.id_fonca_com_fonc.id_fonc AND a_com_fonc.id_pers=personne.id_pers AND [nom_fonc]='signataire'">

voici le code généré par le trigger :

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
CREATE TRIGGER [insert_sign] ON [dbo].[personne]
FOR INSERT
AS
DECLARE @id_pers bigint
INSERT INTO a_com_fonc
(id_pers, id_fonc) VALUES (@id_pers, 3)
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

 le message d'erreur qu'il me met :

Cannot insert the value NULL into column 'id_pers',...

merci de votre aide !
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
crilun 114 Messages postés lundi 10 mai 2004Date d'inscription 17 octobre 2006 Dernière intervention - 15 juin 2006 à 12:29
3
Merci
crilun

salut,

il y a un truc qui me chagrine dans ta requete :

INSERT INTO [personne] ([id_pers], [wwid_pers], [nom_pers], [id_chef_pers]) VALUES ('', @wwid_pers, @nom_pers, @id_chef_pers)

id_pers n'est pas une clef primaire autoincrementable?

si ou dans ce cas tu ne peut pas choisir toi meme la valeur à inserer d'ou le IDENTITY_INSERT is set to OFF.
ta requete devient donc :

INSERT INTO [personne] ([wwid_pers], [nom_pers], [id_chef_pers]) VALUES (@wwid_pers, @nom_pers, @id_chef_pers)


ensuite :
Violation of PRIMARY KEY constraint 'PK_a_com_fonc'. Cannot insert duplicate key in object 'a_com_fonc'.
veut juste dire que tu as un probleme de clef
primaire dans la table a_com_fonc c'est a dire que par exemple si tes
clefs primaires sont id_pers et id_fonc,dans ton code tu as essayé
d'inserer le meme id_pers pour la meme fonction donc il te jete
puisqu'il ne peut ajouter 2 enregistrements ayant le meme doublé de
clefs puisque c'est leur identifiant.


précise moi si id_pers est un autoincrementable et la relation entre
personne et fonction,en gros est ce que tu geres les fonctions dans le
temps c'est a dire est ce que si une personne change de fonction est ce
que tu concerve son ancienne fonction avec un champ date et tu l'insere
ensuite avec une nouvelle fonction ou bien est ce que tu fais
simplement une mise à jour de sa fonction.

et je te dirais ou mettre les clefs sur tes tables.

Merci crilun 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 104 internautes ce mois-ci

Commenter la réponse de crilun
crilun 114 Messages postés lundi 10 mai 2004Date d'inscription 17 octobre 2006 Dernière intervention - 9 juin 2006 à 12:48
0
Merci
crilun


pourquoi tu declares @id_pers comme un bigint???

si c'est une nouvelle variable alors il est vrai que tu ne la remplie pas donc normal qu'elle soit à NULL

par contre si ce champ appartient à ta table de depart t'as pas besoin de redeclarrer.


en regardant plus haut je vois wwid_pers comme champ, je pense que c'est  donc plutot ca que tu veux :

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

ALTER TRIGGER [insert_sign] ON [dbo].[personne]
FOR INSERT
AS
--DECLARE @id_pers bigint
INSERT INTO a_com_fonc
(id_pers, id_fonc) VALUES (
wwid_pers
, 3)
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
Commenter la réponse de crilun
bootchoz 88 Messages postés mardi 3 mai 2005Date d'inscription 17 septembre 2006 Dernière intervention - 9 juin 2006 à 15:37
0
Merci
en fait, 'id_pers' est la clé primaire de ma table, elle s'incremente donc automatiquement. 'wwid_pers' est un de ses attributs.
j'ai 3 tables : personne, fonction, a_com_fonc.
je voudrais recupérer l'identifiant, généré par l'insertion du nouvel enregistrement dans la table personne, pour le mettre dans la table a_com_fonc avec l'id_fonc correspondant (ici 3)
Commenter la réponse de bootchoz
crilun 114 Messages postés lundi 10 mai 2004Date d'inscription 17 octobre 2006 Dernière intervention - 9 juin 2006 à 17:18
0
Merci
crilun

essaye ca :

en fait tu recuperes l'id qui vient d'etre inseré avec FROM INSERTED


par contre pour ta fonction si c'est toujours 3 c'est bon,

en revanche tu ne peut pas passer de parametres a un trigger,

par consequent si tu veut le passer en parametre, plutot que de passer
par une requete+trigger pour faire ton insertion passe par une
procedure stockée qui te fera tout ca,

mais ca ne sera pas generé automatiquement dans tes autres applis du
coup mais tu pourras toujours reutiliser ta procdure stockée

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

ALTER TRIGGER [insert_sign] ON [dbo].[personne]
FOR INSERT
AS


DECLARE @id_pers bigint

SET @id_pers=(SELECT id_pers FROM INSERTED)

INSERT INTO a_com_fonc
(id_pers, id_fonc) VALUES (
@id_pers
, 3)
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
Commenter la réponse de crilun
bootchoz 88 Messages postés mardi 3 mai 2005Date d'inscription 17 septembre 2006 Dernière intervention - 11 juin 2006 à 13:44
0
Merci
merci, je vais essayer ça.
Commenter la réponse de bootchoz
bootchoz 88 Messages postés mardi 3 mai 2005Date d'inscription 17 septembre 2006 Dernière intervention - 12 juin 2006 à 14:18
0
Merci
c'est encore moi !!!
j'ai modifié ma procedure :
CREATE PROCEDURE InsertSign


AS
DECLARE @id_resp bigint
DECLARE @id_pers bigint
DECLARE @id_fonc bigint
DECLARE @nom_pers varchar(50)
DECLARE @wwid_pers varchar(10)


INSERT INTO [personne] ([wwid_pers], [nom_pers], [id_resp]) VALUES
  (@wwid_pers, @nom_pers, @id_resp)


 
SET @id_pers=(SELECT id_pers FROM INSERTED)
SET @id_fonc=(SELECT id_fonc FROM fonction WHERE nom_fonc='signataire')


INSERT INTO a_com_fonc
(id_pers, id_fonc) VALUES (@id_pers, @id_fonc)
GO
et je l'appelle via ce code :


using (
SqlConnection con =
new
SqlConnection(connectionString))


{



SqlCommand
com =

new



SqlCommand
(

"insertSign"
, con);



com.CommandType = CommandType.StoredProcedure;


con.Open();


com.ExecuteNonQuery();


con.Close();


}

j'ai toujour l'erreur Cannot insert the value NULL into column 'id_resp'
et en plus Invalid object name 'INSERTED'
je ne sais plus quoi faire !!!
est-ce kil existe une methode pour le faire de facon atomique ?
Commenter la réponse de bootchoz
crilun 114 Messages postés lundi 10 mai 2004Date d'inscription 17 octobre 2006 Dernière intervention - 12 juin 2006 à 15:42
0
Merci
crilun

normal INSERTED ne sert que pour les triggers, la requete que je t'ai
filé avant es un trigger pour le mettre en procedure stockée :


INSERT INTO [personne] ([wwid_pers], [nom_pers], [id_resp]) VALUES

  (@wwid_pers, @nom_pers, @id_resp)


SET @id_pers=(SELECT MAX(id_pers) FROM PERSONNE)

SET @id_fonc=(SELECT id_fonc FROM fonction WHERE nom_fonc='signataire')


INSERT INTO a_com_fonc

(id_pers, id_fonc) VALUES (@id_pers, @id_fonc)


dans ta procédure stockée je te conseil de rajouter une transaction
(c'est bien documenté et i y a des exemples dans la doc sql server, ca
te permet d'effectuer plusieurs requete et de faire les mises ajour
uniquement si tuoutes tes requetes ce sont bien passées sinon aucune
modificatio n'es apporté)
Commenter la réponse de crilun
bootchoz 88 Messages postés mardi 3 mai 2005Date d'inscription 17 septembre 2006 Dernière intervention - 15 juin 2006 à 10:35
0
Merci
me revoilà avec mon soucis un peu different cette fois car j'ai essayé avec une procédure :

CREATE PROCEDURE InsertAdmin


 AS


BEGIN TRANSACTION

DECLARE @id_fonc bigint
DECLARE @id_pers bigint
DECLARE @wwid_pers bigint
DECLARE @nom_pers varchar(50)
DECLARE @id_chef_pers bigint




INSERT INTO [personne] ([id_pers], [wwid_pers], [nom_pers], [id_chef_pers]) VALUES ('', @wwid_pers, @nom_pers, @id_chef_pers)


SET @id_fonc=(SELECT id_fonc FROM fonction WHERE nom_fonc='administrateur')
SET @id_pers=(SELECT MAX(id_pers) FROM [personne])


INSERT INTO a_com_fonc
(id_pers, id_fonc) VALUES (@id_pers, @id_fonc)

COMMIT TRANSACTION
GO

je l'insere dans ma page.aspx comme ceci :
<asp:SqlDataSource
ID="SqlDataSource1"
runat="server"
ConnectionString="<%$ ConnectionStrings:ConnectionString %>
" InsertCommand="InsertAdmin"
InsertCommandType="StoredProcedure" />


<asp:LinkButtonID="InsertButton" runat="server"CausesValidation="True"CommandName="Insert" Text="Insert">

le message d'erreur est le suivant :Procedure InsertAdmin has no parameters and arguments were supplied

j'ai essayé en les ecrivant : CREATE PROCEDURE InsertAdmin @id_pers bigint, @wwid_pers bigint, @nom_pers varchar(50), @id_chef_pers bigint
le nouveau message d'erreur est :Cannot insert explicit value for identity column in table 'personne' when IDENTITY_INSERT is set to OFF.
Violation of PRIMARY KEY constraint 'PK_a_com_fonc'. Cannot insert duplicate key in object 'a_com_fonc'.

I'm stuck, help me please... 
Commenter la réponse de bootchoz
bootchoz 88 Messages postés mardi 3 mai 2005Date d'inscription 17 septembre 2006 Dernière intervention - 16 juin 2006 à 09:18
0
Merci
merci, merci, merci...
enfin ca fonctionne ! j'ai juste supprimer IDENTITY_INSERT is set to OFF
et modifier la requete comme tu l'as ecrite.
id_pers est bien auto incrementable et une personne peut avoir 1 ou plusieurs fonction associée et pour une fonction il existe une ou plusieurs personnes. d'ou la table qui contient les cles primaires id_fonc et id_pers.
encore merci
Commenter la réponse de bootchoz
crilun 114 Messages postés lundi 10 mai 2004Date d'inscription 17 octobre 2006 Dernière intervention - 16 juin 2006 à 13:23
0
Merci
crilun

si tu as modifié la requete tu n'as pas besoin de retirer
IDENTITY_INSERT is set to OFF il vaut mieux laisser le serveur SQL
gerer l'incrementation des id_pers dans la mesure du possible
Commenter la réponse de crilun

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.