Захват вывода вложенной хранимой процедуры в C # - PullRequest
0 голосов
/ 30 апреля 2018

Я вызываю одну хранимую процедуру (2) из ​​другой хранимой процедуры (1). Обе хранимые процедуры возвращают набор данных в виде оператора SELECT в конце. Мне нужно захватить оба из них в моем коде c #, однако, мой код только захватывает набор данных Select хранимой процедуры (2). Пожалуйста, руководство, как я могу сделать это?

Вот формат процедур:

CREATE PROCEDURE dbo.GoalStop
    @ID INT,
    @StopDate [DATETIME] = NULL
WITH EXECUTE AS CALLER
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @Return varchar(500);
    BEGIN TRY
        UPDATE dbo.Table2
        SET StopDate = @StopDate 
        WHERE TableID = @ID

        SET @Return = 'The Goal was successfully stopped.';

        SELECT 'DATABASE MESSAGE: ' + @Return
    END TRY
    BEGIN CATCH
        IF @@TRANCOUNT > 0
            ROLLBACK

        DECLARE @ErrMsg VARCHAR(4000), @ErrSeverity INT

        SELECT 
            @ErrMsg = ERROR_MESSAGE(), 
            @ErrSeverity = ERROR_SEVERITY()

        RAISERROR(@ErrMsg, @ErrSeverity, 1)
    END CATCH
END

И хранимая процедура вызова:

CREATE PROCEDURE [dbo].[Goal_Restart]
    @ID [INT],
    @Goal [DECIMAL](18, 8) = NULL,
    @StartDate [DATETIME] = NULL,
    @StopDate [DATETIME] = NULL,
    @Updatedby [VARCHAR](8),
    @UpdateDate [DATETIME] = NULL
WITH EXECUTE AS CALLER
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @Return varchar(500)

    BEGIN TRY

    SELECT  @Name = Name 
    FROM [dbo].Table1
    WHERE ID = @ID

    --bunch of IF ELSE Statements...

        BEGIN
            EXEC dbo.GoalStop  @ID, @StopDate --Call to other stored procedure
            INSERT INTO [dbo].Table1([Name], [Goal], [StartDate], [StopDate], [Updatedby], [UpdateDate])
            VALUES (@Name, @Goal, @StartDate, @StopDate, @Updatedby, @UpdateDate)

            SET @Return = 'The Goal was successfully created.';             
         END
     END

     SELECT 'DATABASE MESSAGE: ' + @Return

    END TRY
    BEGIN CATCH
        IF @@TRANCOUNT > 0
            ROLLBACK

        DECLARE @ErrMsg VARCHAR(4000), @ErrSeverity INT
        SELECT @ErrMsg  =  ERROR_MESSAGE(), @ErrSeverity = ERROR_SEVERITY()
        RAISERROR(@ErrMsg, @ErrSeverity, 1)
    END CATCH
END

Output of stored procedure in query analyzer

и код C #, вызывающий эту процедуру:

string returnString = string.Empty;
SqlDataReader reader;

try
{
    using (SqlConnection connection = Connection.GetSqlConnection())
    {
        using (SqlCommand command = new SqlCommand("dbo.Goal_Restart", connection))
        {
            command.CommandType = CommandType.StoredProcedure;
            command.CommandTimeout = 90;

            command.Parameters.Add("@ID", SqlDbType.Int).Value = ID;
            command.Parameters.Add("@Goal", SqlDbType.Decimal).Value = goal;
            command.Parameters.Add("@Updatedby", SqlDbType.Char, 7).Value = Updatedby;
            command.Parameters.Add("@UpdateDate", SqlDbType.DateTime).Value = updateDate;

            if (startDate != null)
            {
                command.Parameters.Add("@StartDate", SqlDbType.DateTime).Value = startDate;
            }

            if (stopDate != null && (Convert.ToDateTime(stopDate)).ToShortDateString() != "1/1/1900")
            {
                command.Parameters.Add("@StopDate", SqlDbType.DateTime).Value = stopDate;
            }

            if (connection.State != ConnectionState.Open)
            {
                connection.Open();
            }

            command.Prepare();
            reader = command.ExecuteReader();

            while (reader.Read())
            {
                returnString = reader[0].ToString();
            }
        }
    }
}

Если я выполняю exec в анализаторе запросов, вывод - результат двух разностных запросов (см. Прикрепленное изображение)

DATABASE MESSAGE: The Goal was successfully Stopped.
DATABASE MESSAGE: The Goal was successfully created.

Однако returnString в C # захватывает только сообщения от вложенной процедуры и не вызывает процедуру.

DATABASE MESSAGE: The Goal was successfully Stopped.

Как мне захватить обе или только вызывающую процедуру?

1 Ответ

0 голосов
/ 30 апреля 2018

Точно так же, как ваш курсор на следующую строку с помощью SqlDataReaderReader.Read, вы также должны навести курсор на следующий набор результатов , используя SqlDataReader.NextResult () .

while (reader.Read())
{
    //Do something with first resultset
}
var ok = reader.NextResult();
if (ok)
{
    while (reader.Read())
    {
        //Do something with outer proc's resultset  
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...