代码成功时,ExecuteNonQuery返回-1

时间:2018-10-20 05:16:56

标签: c# sql-server

我已经用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

2 个答案:

答案 0 :(得分:0)

ExecuteNonQuery返回受DELETEINSERTUPDATE语句影响的行数-因为这是通常的用法。它不会返回从SELECT语句中选择的行数-而是返回-1。

:由于ExecuteNonQuery调用并没有给您实际返回数据的机会,因此使用SELECT确实没有多大意义-您应该改用ExecuteReader调用,该调用返回一个SqlDataReader,然后您可以使用该调用迭代SELECT语句返回的数据,并以所需的任何方式使用该数据。

答案 1 :(得分:0)

对于UPDATE,INSERT和DELETE语句,返回值是该命令影响的行数。当要插入或更新的表上存在触发器时,返回值包括受插入或更新操作影响的行数以及受一个或多个触发器影响的行数。

对于所有其他类型的语句,返回值为-1。如果发生回滚,则返回值也为-1。

如果我们通过ExecuteNonQuery运行存储过程,它将始终返回-1。

另请参见this page