我正在编写一个与SQL Server交互的C#程序。我愚蠢地将查询字符串硬编码到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
有谁知道为什么会发生这种情况?非常感谢!
答案 0 :(得分:16)
因为你把它关了:
SET NOCOUNT ON;
答案 1 :(得分:1)
您是否尝试过使用@@RowCount;
而不是依赖于返回的行计数,如果它是INSERT, UPDATE, or DELETE
。
围绕SP的许多建议似乎都是使用@@RowCount
和SET NOCOUNT ON;