ExecuteNonQuery Возвращает -1, если код успешно

голоса
0

Я написал инструмент в C #, что позволяет моему менеджеру, чтобы запустить набор команд SQL в конце каждого месяца. Команды SQL хранятся в базе данных, так что я могу легко поддерживать его по мере изменения требований. Каждая последующая команда может или не может быть разрешено работать на основе успеха предыдущей команды.

На самом деле команда хранится в моей базе данных только команда SQL, которая вызывает хранимую процедуру, где все сложный материал.

Я использую команду C # , ExecuteNonQuery()и это , как правило , возвращает -1 , если это не удается , и что - то еще , если это удастся ( до сих пор так хорошо). Он работает , как это в течение многих лет.

Теперь приходит немного обслуживания.

Все мои хранимых процедур ранее обновления данных в моей базе данных. Теперь мне нужно добавить хранимую процедуру, которая проверяет, является ли то, что уже существует в базе данных. Если он не существует, или не полностью, я хочу вернуться -1 или что-то еще, если данные существуют.

Я попытался поворота SET NOCOUNT OFFи это не помогло , и я думаю , что свели на тот факт , что моя последняя процедура ничего не обновлять , и поэтому ExecuteNonQueryвидит это как провал.

Я запускать команды в Management Studio, и они сообщают об успехах, как и ожидалось. Текущая команда даже возвращает «1 строку (ы)» осуществляется на вкладке сообщений.

Вот код хранимой процедуры, так что вы можете увидеть, что я пытался до сих пор. Я стараюсь, чтобы избежать необходимости изменить мою C # программу так, что использует различные команды в зависимости от типа SQL называется.

Кто-нибудь есть идеи?

USE [Billing]
GO
/****** Object:  StoredProcedure [dbo].[Billing_Test_Uncharged_Entries]    
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- 
ALTER PROCEDURE [dbo].[Billing_Test_Uncharged_Bing_Entries] 
    -- Add the parameters for the stored procedure here
AS

DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;

BEGIN TRY
    --SET NOCOUNT ON;
    Set NOCOUNT OFF;

    -- Insert statements for procedure here
    --SELECT <@Param1, sysname, @p1>, <@Param2, sysname, @p2>
    If Not Exists
    (
        SELECT [lSundriesID]
        FROM [Strata].[dbo].[vjrSundries]
        where 
        lFeeCodeID = '77' And
        -- lFeeCodeID = '999' And  --(Use this line to force an error during testing)
        lMonthfeeApplies is null
    )
    Begin
        --print 'Nothing to see here'
        --Return -1

        SELECT 
            @ErrorMessage = 'No FeeCodeID=77 Items found, Has the Bing EP Mailroom import process been run in Sundries',
            @ErrorSeverity = 11,
            @ErrorState = 1;

            RAISERROR (
                @ErrorMessage,  -- Message text
                @ErrorSeverity, -- Severity
                @ErrorState     -- State
            );
    End
    Else
    Begin
        Select 'Found Something'
    End
END Try
Begin Catch

            SELECT 
                @ErrorMessage = ERROR_MESSAGE(),
                @ErrorSeverity = ERROR_SEVERITY(),
                @ErrorState = ERROR_STATE();

                RAISERROR (@ErrorMessage, -- Message text.
                   @ErrorSeverity, -- Severity.
                @ErrorState -- State.
                );
End Catch
Задан 20/10/2018 в 05:16
источник пользователем
На других языках...                            


2 ответов

голоса
0

Для UPDATE, INSERT и DELETE заявления, возвращаемое значение является числом строк, затронутых командой. Когда запускающий существует на столе будучи вставленной или обновлен, возвращаемое значение включает в себя количество строк, затронутых как вставки или операции обновления, а количество строк, затронутых триггера или триггеры.

Для всех других видов отчетности, возвращаемое значение равно -1. Если происходит откат, возвращаемое значение также -1.

если запустить хранимую процедуру через ExecuteNonQuery он будет возвращен -1 всегда

см этой страницы также.

Ответил 20/10/2018 в 07:00
источник пользователем

голоса
0

ExecuteNonQueryвозвращает количество затронутых строк по DELETE, INSERTили UPDATEзаявление - потому что это то , что он используется для обычно. Это НЕ возвращает количество строк , выбранных из SELECTзаявления - вместо этого он возвращает -1.

НО : так как ExecuteNonQueryвызов не дает вам шанс на самом деле получить возвращенные данные, это действительно не имеет большого смысла, когда SELECT- вы должны использовать ExecuteReaderвызов вместо, который возвращает SqlDataReaderкоторый затем можно использовать для итерации по данным возвращенное SELECTзаявление и использовать эти данные в зависимости от того , как вы это необходимо.

Ответил 20/10/2018 в 06:43
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more