Meilleur auteur de réponses
ExecuteStoreCommand doesn't return the row number

Question
-
Hi,
I execute a stored procedure with this command and it always returns -1 !
My stored procedure:
ALTER PROCEDURE [dbo].[AddPatient]
-- Add the parameters for the stored procedure here
(
@ParamValue DMPPatientData READONLY
)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
INSERT INTO DMP_Patient SELECT * FROM @ParamValue;
--SELECT @@ROWCOUNT;
ENDand my C# code is :
SqlParameter sqlParam = new SqlParameter { ParameterName = "@ParamValue", Value = pDT, TypeName = "[dbo].[DMPPatientData]", SqlDbType = SqlDbType.Structured};
var sqlParams = new object[] { sqlParam };
Int32 result = 0;
result = DMPcontext.ExecuteStoreCommand("exec AddPatient @ParamValue", sqlParams);pDT is a datatable.
Any ideas ?
Thanks a lot and Happy new year !
- Modifié AgnostikFront vendredi 13 janvier 2012 14:18
Réponses
-
Hi,
The MSDN website says about "SET NOCOUNT ON" : " Stops the message that shows the count of the number of rows affected by a Transact-SQL statement or stored procedure from being returned as part of the result set. "
So you can't get the number of lines affected by your stored procedure. Can you confirm it works without this line ?
Best regards,
Sébastien
En français :
La MSDN nous dit à propos de la commande "SET NOCOUNT ON" : "Empêche le message indiquant le nombre de lignes concernées par une instruction ou une procédure stockée Transact-SQL d'être renvoyé avec l'ensemble de résultats."
Donc tu ne peux pas récupérer le nombre de lignes affectées par la procédure stockée. Tu confirmes que ça fonctionne sans cette ligne ?
Cordialement,
Sébastien
Sébastien Putier
Consultant - Formateur technologies Microsoft
Blog : http://sputier.wordpress.com
MCTS Développement d'application Windows 4.0- Modifié Sébastien Putier vendredi 13 janvier 2012 14:51
- Marqué comme réponse Ciprian Duduiala jeudi 19 janvier 2012 08:52
-
Merci B.sow,
mais j'utilise l'ef4 comme methode de connection a la BD sql Server 2008, donc voilà mon code C#
SqlParameter sqlParam = new SqlParameter { ParameterName = "@ParamValue", Value = pDT, TypeName = "[dbo].[DMPPatientData]", SqlDbType = SqlDbType.Structured};
var sqlParams = new object[] { sqlParam };
Int32 result = DMPcontext.ExecuteStoreCommand("exec AddPatient @ParamValue", sqlParams);et du côté de ma proc stock que j'ai améliorée depuis ;) :
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @DMPSeq INT;
DECLARE @Version SMALLINT;
DECLARE @RC INT;
DECLARE @UPDVALUE DMPPatientData;
SET @RC = 0;
SELECT @DMPSeq = DMPSeq FROM @ParamValue;
INSERT INTO @UPDVALUE SELECT * FROM @ParamValue;
IF EXISTS (SELECT * FROM DMP_Patient WHERE DMPSeq = @DMPSeq AND DMP_Patient.Status = 0)
BEGIN
SELECT @Version = DMP_Patient.Version + 1 FROM DMP_Patient WHERE DMPSeq = @DMPSeq AND DMP_Patient.Status = 0;
UPDATE DMP_Patient SET DMP_Patient.Status = 1 WHERE DMPSeq = @DMPSeq AND DMP_Patient.Status = 0;
UPDATE @UPDVALUE SET Version = @Version;
INSERT INTO DMP_Patient SELECT * FROM @UPDVALUE;
SET @RC = @@ROWCOUNT;
END
ELSE
BEGIN
INSERT INTO DMP_Patient SELECT * FROM @ParamValue;
SET @RC = @@ROWCOUNT;
END
SELECT @RC;
ENDJ'ai laissé le SET NOCOUNT ON; car a priori cela renvoi systématiquement un message pour chaque commande SQL de la PS, et cela ne m'intéresse pas (ci dessous extrait Aide MSSQL)
"SET NOCOUNT ON empêche l'envoi de messages DONE_IN_PROC au client pour chaque instruction d'une procédure stockée. Dans le cas de procédures stockées contenant plusieurs instructions qui ne retournent que peu de données, ou pour els procédures qui contiennent des boucles Transact-SQL, la définition de SET NOCOUNT à ON peut améliorer considérablement les performances car le trafic réseau est sensiblement réduit."
Par contre, concernant la première version de ma PS, je pense qu'effectivement cela devait inhiber le retour de mon Insert.
Merci à tous,
- Marqué comme réponse AgnostikFront vendredi 17 février 2012 09:39
Toutes les réponses
-
Hi,
The MSDN website says about "SET NOCOUNT ON" : " Stops the message that shows the count of the number of rows affected by a Transact-SQL statement or stored procedure from being returned as part of the result set. "
So you can't get the number of lines affected by your stored procedure. Can you confirm it works without this line ?
Best regards,
Sébastien
En français :
La MSDN nous dit à propos de la commande "SET NOCOUNT ON" : "Empêche le message indiquant le nombre de lignes concernées par une instruction ou une procédure stockée Transact-SQL d'être renvoyé avec l'ensemble de résultats."
Donc tu ne peux pas récupérer le nombre de lignes affectées par la procédure stockée. Tu confirmes que ça fonctionne sans cette ligne ?
Cordialement,
Sébastien
Sébastien Putier
Consultant - Formateur technologies Microsoft
Blog : http://sputier.wordpress.com
MCTS Développement d'application Windows 4.0- Modifié Sébastien Putier vendredi 13 janvier 2012 14:51
- Marqué comme réponse Ciprian Duduiala jeudi 19 janvier 2012 08:52
-
Merci d’avoir contacté les forums MSDN France. La langue utilisée sur ces forums est la langue française, donc s’il vous plaît repostez votre question en français, comme on vous demande dans l’étiquette sur les forums MSDN France.
Pouvez-vous confirmer si la solution de Sébastien fonctionne ou pas ? Pouvez-vous aussi nous expliquer qu’attendez-vous comme résultat de la procédure stockée ?
Cordialement,
Cipri
Ciprian DUDUIALA, MSFT  
•Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.
-
Bonjour,
Si je comprend ton problème AgnostikFront , je pense que tu dois voir comment tu géres les SqlParameter et aussi l'execution de ta procédure stockée dans ta méthode C#.
tu peux faire ceux ci :
SqlCommand commandRes = new SqlCommand("NomDeLaProcedureStockée",ConnectionSql);
commandRes.CommandType = CommandType.StoredProcedure;
commandRes.Parameters.Add(new SqlParameter
("@ParamProcStokee",
SqlDbType.XXTYPE,
50,
ParamProcStokee.Output,
false,
0,
50,
"ParamProcStokee",DataRowVersion.Default,null));
commandRes.Parameters["@ParamProcStokee"].Value = XXXX;
//Tu peux reproduire cette ligne autant de fois que tu as de paramétres d'entrée de la proc stock
---------------------------------------------------------------
//Execution puis recupération de résultat de l'exécution
result = commandRes.ExecuteNonQuery();
---------------------------------------------------------------
ConnectionSql.close
---------------------------------------------------------------
Bon courage
So B- Proposé comme réponse philipe 28 mardi 17 janvier 2012 19:33
- Marqué comme réponse Ciprian Duduiala jeudi 19 janvier 2012 08:52
- Non marqué comme réponse AgnostikFront vendredi 17 février 2012 09:39
-
Merci B.sow,
mais j'utilise l'ef4 comme methode de connection a la BD sql Server 2008, donc voilà mon code C#
SqlParameter sqlParam = new SqlParameter { ParameterName = "@ParamValue", Value = pDT, TypeName = "[dbo].[DMPPatientData]", SqlDbType = SqlDbType.Structured};
var sqlParams = new object[] { sqlParam };
Int32 result = DMPcontext.ExecuteStoreCommand("exec AddPatient @ParamValue", sqlParams);et du côté de ma proc stock que j'ai améliorée depuis ;) :
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @DMPSeq INT;
DECLARE @Version SMALLINT;
DECLARE @RC INT;
DECLARE @UPDVALUE DMPPatientData;
SET @RC = 0;
SELECT @DMPSeq = DMPSeq FROM @ParamValue;
INSERT INTO @UPDVALUE SELECT * FROM @ParamValue;
IF EXISTS (SELECT * FROM DMP_Patient WHERE DMPSeq = @DMPSeq AND DMP_Patient.Status = 0)
BEGIN
SELECT @Version = DMP_Patient.Version + 1 FROM DMP_Patient WHERE DMPSeq = @DMPSeq AND DMP_Patient.Status = 0;
UPDATE DMP_Patient SET DMP_Patient.Status = 1 WHERE DMPSeq = @DMPSeq AND DMP_Patient.Status = 0;
UPDATE @UPDVALUE SET Version = @Version;
INSERT INTO DMP_Patient SELECT * FROM @UPDVALUE;
SET @RC = @@ROWCOUNT;
END
ELSE
BEGIN
INSERT INTO DMP_Patient SELECT * FROM @ParamValue;
SET @RC = @@ROWCOUNT;
END
SELECT @RC;
ENDJ'ai laissé le SET NOCOUNT ON; car a priori cela renvoi systématiquement un message pour chaque commande SQL de la PS, et cela ne m'intéresse pas (ci dessous extrait Aide MSSQL)
"SET NOCOUNT ON empêche l'envoi de messages DONE_IN_PROC au client pour chaque instruction d'une procédure stockée. Dans le cas de procédures stockées contenant plusieurs instructions qui ne retournent que peu de données, ou pour els procédures qui contiennent des boucles Transact-SQL, la définition de SET NOCOUNT à ON peut améliorer considérablement les performances car le trafic réseau est sensiblement réduit."
Par contre, concernant la première version de ma PS, je pense qu'effectivement cela devait inhiber le retour de mon Insert.
Merci à tous,
- Marqué comme réponse AgnostikFront vendredi 17 février 2012 09:39