使用 ExecuteNonQuery() 时返回值不正确

本文关键字:返回值 不正确 ExecuteNonQuery 使用 | 更新日期: 2023-09-27 18:34:19

我正在编写一个与SQL Server交互的C#程序。 我愚蠢地将查询字符串硬编码到 C# 程序中,并希望将它们转换为服务器上的存储过程。

出于某种原因,一个特定的 INSERT 语句(工作正常!(不再有效,我不知道为什么。 我甚至运行了 SQL 探查器跟踪,它表明该语句的格式是完美的! 也许有人可以告诉我我做错了什么。

存储过程:此 SP 只是获取一堆参数并将它们插入到表中。 很简单。

ALTER PROCEDURE [dbo].[usp_InsertNewChangeRequest]
@Requester INT,
@ChangeCreationDate DATETIME,
@ChangeName VARCHAR(200),
@ChangeDescription VARCHAR(1000),
@LastModifiedDate DATETIME,
@LastModifiedBy INT,
@AffectedArea INT,
@ImplementationPlan VARCHAR(MAX),
@BackoutPlan VARCHAR(MAX),
@RiskLevel TINYINT,
@ApprovalRequired BIT,
@IsApproved BIT
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO dbo.ChangeRequests(Requester, ChangeCreationDate, ChangeName, ChangeDescription, 
            LastModifiedDate, LastModifiedBy, AffectedArea, ImplementationPlan, BackoutPlan, 
            RiskLevel, ApprovalRequired, IsApproved)
VALUES (@Requester, @ChangeCreationDate, @ChangeName, @ChangeDescription,
            @LastModifiedDate, @LastModifiedBy, @AffectedArea, @ImplementationPlan, @BackoutPlan,
            @RiskLevel, @ApprovalRequired, @IsApproved) 
END

我在 C# 中的代码只是准备 SP 参数,然后调用非查询:

public int InsertNewChange(int RequesterID, DateTime CreationDate, string ChangeName,
        string ChangeDescription, DateTime LastModifiedDate, 
        int AffectedAreaID, string ImplementationPlan, string BackoutPlan,
        int RiskLevel, int ApprovalRequired, int IsApproved)
    {
        int retval = 0;
        // Create a command whose name is the stored procedure for inserts
        SqlCommand command = new SqlCommand("usp_InsertNewChangeRequest", scConnection);
        command.CommandType = CommandType.StoredProcedure;
        // add the parameters to the stored procedure
        command.Parameters.Add(new SqlParameter("@Requester", RequesterID));
        command.Parameters.Add(new SqlParameter("@ChangeCreationDate", CreationDate));
        command.Parameters.Add(new SqlParameter("@ChangeName", ChangeName));
        command.Parameters.Add(new SqlParameter("@ChangeDescription", ChangeDescription));
        command.Parameters.Add(new SqlParameter("@LastModifiedDate", LastModifiedDate));
        command.Parameters.Add(new SqlParameter("@LastModifiedBy", RequesterID));
        command.Parameters.Add(new SqlParameter("@AffectedArea", AffectedAreaID));
        command.Parameters.Add(new SqlParameter("@ImplementationPlan", ImplementationPlan));
        command.Parameters.Add(new SqlParameter("@BackoutPlan", BackoutPlan));
        command.Parameters.Add(new SqlParameter("@RiskLevel", RiskLevel));
        command.Parameters.Add(new SqlParameter("@ApprovalRequired", ApprovalRequired));
        command.Parameters.Add(new SqlParameter("@IsApproved", IsApproved));
        retval = command.ExecuteNonQuery();
        return retval;
    }

我经常得到一个 -1 的返回值,而以前,当我完全用 C# 拼写 SQL 文本时,我会得到一个 1,对于插入的 1 行。

令人气愤的是,我在执行跟踪时在SQL事件探查器中没有看到任何错误。 它显示语句已通过,看起来完全没问题! 当我将其剪切并粘贴到管理工作室中并自己手动运行时,它工作正常。

    exec usp_InsertNewChangeRequest @Requester=4,@ChangeCreationDate='2012-05-16 17:55:45',@ChangeName='test name',@ChangeDescription='test description',@LastModifiedDate='2012-05-16 17:56:01.937',@LastModifiedBy=4,@AffectedArea=2,@ImplementationPlan='test implem',@BackoutPlan='test backout',@RiskLevel=1,@ApprovalRequired=0,@IsApproved=0

有谁知道为什么这会发生在我身上? 非常感谢!

使用 ExecuteNonQuery() 时返回值不正确

因为你关闭了它:

SET NOCOUNT ON;

您是否尝试过使用@@RowCount;而不是依赖于返回的行计数(如果它是一个INSERT, UPDATE, or DELETE(。

似乎围绕SP的许多建议是使用@@RowCountSET NOCOUNT ON;