none
ExecuteStoreCommand doesn't return the row number RRS feed

  • 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;
    END

     

    and 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 !

     

     


    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
    vendredi 13 janvier 2012 14:42
  • 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;
    END

    J'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
    vendredi 17 février 2012 09:38

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
    vendredi 13 janvier 2012 14:42
  • Bonjour,

     

    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


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    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.

    lundi 16 janvier 2012 08:28
  • 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
    mardi 17 janvier 2012 15:21
  • 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;
    END

    J'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
    vendredi 17 février 2012 09:38