2012-05-16 2 views
3

SQL Server와 상호 작용하는 쓰는 C# 프로그램이 있습니다. 저는 어리석게도 쿼리 문자열을 C# 프로그램에 하드 코딩하여 대신 서버의 저장 프로 시저로 변환하려고했습니다.ExecuteNonQuery()를 사용할 때 잘못된 반환 값

어떤 이유 때문에 특정 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 매개 변수를 최상의 상태로 준비

는 nonquery 호출 :

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 프로파일 러에 오류가 표시되지 않습니다. 전달 된 문을 보여 주며 완벽하게 보입니다! 내가 잘라내어 그것을 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

시도를 사용하는 것입니다. 다음 줄에 SqlCommand 명령 = 새 SqlCommand ("dbo.usp_InsertNewChangeRequest", scConnection); – atbebtg

+0

@atbebtg : 아니요 ... 저장 프로 시저가 dbo없이 제대로 실행됩니다. –

+1

행이 삽입됩니까? – pjp

답변

15

당신은 그것을 해제하기 때문에 :

SET NOCOUNT ON; 
+2

+1 : 예. 'SET NOCOUNT ON;'은 영향을받은 행의 수를 세지 않고 반환하는 것을 방지합니다. @ user1399660 : 'ON'을 'OFF'로 변경하거나 저장 프로 시저에서 문을 제거하십시오. –

+0

@@ rowcount를 사용하고 출력 매개 변수를 사용하여 행 수를 출력하도록 저장 프로 시저를 변경하거나 try/catch를 사용하여 성공 또는 실패에 따라 적절한 상태를 반환한다고 생각합니다. NOCOUNT를 OFF로하는 것에 대한 문제는 모자를 쓰는 것이 널리 공표 된 모범 사례이며, 저장 프로 시저가 OFF 동작에 의존하고 있음을 알 수있는 방법이 전혀없는 정리 작업자에 의해 변경 될 수 있습니다. –

+0

감사합니다. Aaron, 나는이 특정 데이터베이스에 대한 통제권을 가지고 있지만, 프로그램이 SET NOCOUNT OFF에 의존한다는 코드에 주석을 남깁니다. – Skkra

1

@@RowCount;를 사용하는 대신 그것이 INSERT, UPDATE, or DELETE의 경우 행 수에 의존하는 것은 반환 노력했다.

그것은 SP 주위에 많은 제안을 표시는 DBO를 추가 @@RowCountSET NOCOUNT ON;

+0

@asawyer 생성 된 마지막 ID 값을 반환하지 않습니까? 그는 ID 값이 아닌 행의 수를 원합니다. –

+0

예 알아요. 나는 그것을 삭제했다. 나는 불평을 읽지 않는다. – asawyer