2011-12-13 6 views
1

나는 그렇게 보이는 저장 프로 시저가 있습니다.sqlCommand.ExecuteNonQuery()를 사용하여 범위 ID를 반환합니다.

ALTER PROCEDURE dbo.addPackage(

    @PackageStatus      VARCHAR(50) = null, 
    @OrgCode       VARCHAR(50) = null, 
    @SystemID       VARCHAR(50) = null, 
    @ID        int OUTPUT 
) 
AS 
BEGIN 
    insert into package_table 
    (
      PackageStatus, 
      OrgCode, 
      SystemID 
      ) 
      values 
      (@PackageStatus, 
      @OrgCode, 
      @SystemID 
      ) 
      SET @ID = SCOPE_IDENTITY() 
END 

그리고 내 기능은 SQL 명령에 다음 매개 변수를 추가하고 내가 가지고 있지만 출력 파라미터 선언하고 설정 evne sqlCommand.ExecuteNonQuery();

List<SqlParameter> parameters = new List<SqlParameter>(); 

parameters.Add(new SqlParameter("@PackageStatus", package.PackageStatus)); 
parameters.Add(new SqlParameter("@OrgCode", package.OrgCode)); 
parameters.Add(new SqlParameter("@SystemID", package.SystemID)); 

SqlParameter outParameter = new SqlParameter("@ID", SqlDbType.Int); 
outParameter.Direction = ParameterDirection.Output; 
parameters.Add(outParameter); 

하지만 저장된 porcuedure에서 다시 0가 계속 호출 저장 프로 시저가 종료되기 전에 ID에 대한 자동 증가 값으로 레코드가 성공적으로 추가되었지만 출력 매개 변수를 다시 가져올 때 ID가 반환되지 않습니다. 0으로 설정됩니다.

제안 사항?

+2

단순히 출력 매개 변수 대신 스칼라 값을 반환 할 수 있습니까? IMHO. 다루기가 더 쉽습니다. – sfuqua

+0

코드가 올바르지 않은 것 같습니다. 매개 변수 이름은 iD (소문자 I)로 정의됩니다. SET 문은 ID (대문자 I)를 사용하고 코드는 출력 매개 변수의 값을 얻기 위해 완전히 다른 APID를 사용합니다. 사용중인 실제 코드를 게시 할 수 있습니까? –

+0

메모장에서 코드를 변경했습니다. ++. 실제 값은 정확합니다. 나는 단지 그것을 가능한 한 포괄적으로 만들고 싶었다. 그것이 오류의 원인이 아니 었습니다. 그때부터 문제가 무엇인지 발견했습니다. – gsirianni

답변

4

출력 매개 변수를 정의했습니다. .ExecuteNonQuery()을 호출 한 후을 읽어보십시오. 불행하게도, 당신이 그 코드를 표시하지 않을 ...

기본적으로, 당신은

SqlCommand cmd = new SqlCommand(..., connection); ..... 

// set up your parameter as above 

connection.Open(); 
cmd.ExecuteNonQuery(); 

var outputValue = cmd.Parameters["@APID"].Value; // you need to read it out! 

connection.Close(); 

당신이이 일을하고 있습니까 필요? 그리고 그것이 당신이 항상 0으로 돌아가는 곳입니까?

출력 매개 변수는 이 아니며.ExecuteNonQuery() 호출의 반환 값입니다. 호출 후 매개 변수 값을 명시 적으로 읽어야합니다.

+0

예 내 코드에서이 호출을 수행하고 있습니다. APID = Convert.ToInt32 (sqlCommand.Parameters [ "@ APID"]. 값); 중단 점을 설정하고이 값을 검색 할 때 NULL입니다. 따라서 Convert.ToInt32는 0으로 설정합니다. – gsirianni

+1

나는 당신이 이미 제안한 모든 것을 가지고 있었지만, 당신이 대답했기 때문에 나는 진짜 문제를 발견하지 못하게 도와주었습니다. 51 개의 매개 변수가 있었고 그 중 하나는 기본적으로 NULL로 설정되지 않아 문이 실패하고 0을 반환합니다. – gsirianni