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

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

出于某种原因,一个特定的INSERT语句(工作正常!)不再有效,我无法弄清楚原因。 我甚至运行了一个SQL Profiler Trace,它表明该语句完美形成! 也许有人可以告诉我我做错了什么。

存储过程:此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事件探查器中的任何错误。 它显示了通过的声明,它看起来完全没问题! 当我将其剪切并粘贴到Management Studio中并自己手动运行时,它可以正常工作。

  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; 如果它是INSERT, UPDATE, or DELETE而不是依赖于返回的行计数。

看来SP周围有很多建议是使用@@RowCountSET NOCOUNT ON;