Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用ExecuteOnQuery()时返回值不正确_C#_Sql_Sql Server - Fatal编程技术网

C# 使用ExecuteOnQuery()时返回值不正确

C# 使用ExecuteOnQuery()时返回值不正确,c#,sql,sql-server,C#,Sql,Sql Server,我正在编写一个与SQL Server交互的C#程序。我愚蠢地将查询字符串硬编码到C#程序中,并希望将其转换为服务器上的存储过程 出于某种原因,一个特定的INSERT语句(工作正常!)不再工作了,我不知道为什么。我甚至运行了一个SQL探查器跟踪,它显示语句的格式是完美的!也许有人能告诉我我做错了什么 存储过程: 这个SP只需要获取一组参数并将它们插入表中。很简单 ALTER PROCEDURE [dbo].[usp_InsertNewChangeRequest] @Requester INT,

我正在编写一个与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的返回值,而以前,当我把SQL文本全部用C#拼写出来时,插入的1行会得到一个1

令人气愤的是,在执行跟踪时,我在SQL Profiler中没有看到任何错误。它显示已通过的语句,并且看起来完全正常!当我将它剪切粘贴到ManagementStudio中并亲自运行它时,效果很好

    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

有人知道为什么会发生在我身上吗?非常感谢

因为您已将其关闭:

SET NOCOUNT ON;

您是否尝试过使用
@@RowCount
而不是依赖于返回的行计数(如果是
插入、更新或删除)


似乎有很多关于SP的建议是使用
@@RowCount
设置NOCOUNT ON

尝试添加dbo。到以下行SqlCommand=newsqlcommand(“dbo.usp\u InsertNewChangeRequest”,scConnection)@atbebtg:不……存储过程在没有dbo的情况下运行得很好。+1:是的<代码>设置不计数将阻止计算和返回受影响的行数@user1399660:将
打开
更改为
关闭
或从存储过程中删除该语句。我想我更愿意将存储过程更改为使用@rowcount并使用输出参数输出行数,或者使用try/catch并根据成功或失败返回适当的状态。依赖NOCOUNT关闭的问题在于,将其设置为“开”是一种广为宣传的最佳做法,而且存储过程可能会被一个清理人员更改,而清理人员根本无法知道您依赖的是关闭行为。谢谢大家。Aaron,我控制着这个特定的数据库,但是我会在代码中留下一条注释,提到程序依赖于SET NOCOUNT OFF。如果他在Management Studio中运行SP,为什么在该SP中使用SET NOCOUNT ON时返回正确的计数?该设置与.NET代码有什么关系?手动执行SP可以工作,但不能使用SqlCommand?@AndrewFinnell是的,几乎可以。@asawyer不返回生成的上一个标识值吗?他想要的是行数,而不是标识值。