bootchoz
Messages postés88Date d'inscriptionmardi 3 mai 2005StatutMembreDernière intervention17 septembre 2006
-
9 juin 2006 à 10:07
crilun
Messages postés114Date d'inscriptionlundi 10 mai 2004StatutMembreDernière intervention17 octobre 2006
-
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',...
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.
crilun
Messages postés114Date d'inscriptionlundi 10 mai 2004StatutMembreDernière intervention17 octobre 2006 9 juin 2006 à 12:48
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
bootchoz
Messages postés88Date d'inscriptionmardi 3 mai 2005StatutMembreDernière intervention17 septembre 2006 9 juin 2006 à 15:37
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)
crilun
Messages postés114Date d'inscriptionlundi 10 mai 2004StatutMembreDernière intervention17 octobre 2006 9 juin 2006 à 17:18
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
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 ?
crilun
Messages postés114Date d'inscriptionlundi 10 mai 2004StatutMembreDernière intervention17 octobre 2006 12 juin 2006 à 15:42
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é)
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" />
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'.
bootchoz
Messages postés88Date d'inscriptionmardi 3 mai 2005StatutMembreDernière intervention17 septembre 2006 16 juin 2006 à 09:18
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
crilun
Messages postés114Date d'inscriptionlundi 10 mai 2004StatutMembreDernière intervention17 octobre 2006 16 juin 2006 à 13:23
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