2010-08-03 4 views
2

두 정수 출력 매개 변수가 들어있는 저장 프로 시저를 실행하는 SqlCommand가 있습니다. SqlCommand가 실행되기 바로 전에 출력 매개 변수가 올바른 값으로 설정되었음을 알 수 있습니다. 그러나 명령이 실제로 실행될 때 매개 변수를 설정하는 것과 관계없이 parameter1에 NULL을, parameter2에 0을 사용합니다 (SQL Profiler를 사용하여 확인 됨). .C# - 출력 SqlParameter는 주어진 값과 다른 값을 사용합니까?

코드의 단순화 된 버전이 있습니다 :

foreach (KeyValuePair<string, object> parameter in outputParameters) 
{ 
    SqlParameter param = new SqlParameter(parameter.Key, parameter.Value); 
    param.Direction = ParameterDirection.Output; 
    command.Parameters.Add(param); 
} 

command.ExecuteNonQuery(); 

내가 여기에 다른 두 가지 혼동 해요 :

왜이 매개 변수의 값을 사용하지 않는

1)? command.ExecuteNonQuery() 전에 바로 중단 점을 배치하고 command.Parameters 목록에 출력 매개 변수가 올바르게 설정되어 있는지 확인하지만 쿼리가 실행될 때 SQL 프로필러 추적에는 다른 매개 변수가 있습니다.

2) 두 매개 변수는 모두 정수이며 정확히 같은 방식으로 정의됩니다. 다른 하나는 0으로 설정되지만 다른 하나는 NULL로 설정되는 이유는 무엇입니까? 논리적으로는하지 입력에 값이 ... 즉, 값이 저장 프로 시저에서 를 제공하기위한 것입니다 -

+1

가 저장된 프로 시저 –

+0

저장된 프로 시저가 조금 긴 게시하고 문제가되지 않습니다 바랍니다 ... 그것은 SQL 관리 Studio 내에서 잘 실행됩니다. 내 문제는 SQLCommand에서 SQLServer로 전달되는 값이 그들이 말하는 내용이 아니라는 것입니다. – Rachel

+0

귀하의 문제는 귀하의 매개 변수가 입력, 출력 또는 InputOutput인지 여부를 확인할 수 없습니다. 당신이 그들과 뭘하려고하는지 보지 않고는 아무도 올바른 대답을 제공 할 수 없습니다. 질문을 매우 크게하는 것에 대해 걱정하지 마십시오. 나는 그것을 처리 할 대역폭이있다. –

답변

3

그들은 출력 매개 변수입니다. 저장 프로 시저에서 클라이언트의 값을 사용하려면 방향이 InputOutput이어야합니다.

편집 : 귀하의 의견에 회신 - Output 의미 그냥 출력을 의미합니다. Input을 의미하며 입력을 의미합니다. InputOutput은 두 가지 방법을 의미합니다. 두 가지 모두를 원하는 것처럼 들리므로 InputOutput을 사용하십시오.

이유는 하나는 null이고 다른 하나는 ... 솔직히 말해서 모르겠다.

+0

입력 및 출력 모두에 대해 동일한 매개 변수를 사용할 수 있습니다. 유효한 매개 변수를 사용하여 SQL 관리 스튜디오에서 문제없이 프로 시저를 실행할 수 있습니다. 그 이유는 값이 쿼리에 사용 되었기 때문입니다.하지만 수정 될 가능성이 있으며 변경 내용을 클라이언트에 반환하려고합니다. – Rachel

+2

@Rachel - 저장 프로 시저도 게시해야합니다. – JonH

+3

@Rachel, 두 가지 모두에 대해 동일한 매개 변수를 사용할 수 있지만 방향은 출력이 아닌 InputOutput입니다. –

4

Output이 아닌 InputOutput (op 편집 당) 방향을 변경하려고합니다.

출력 매개 변수를 참조 할 때 값은 코드에서가 아니라 실제 저장 프로 시저에서 반환되어야한다고 코드에 알려줍니다. 코드에 값이 포함되어 있더라도 코드는 출력 매개 변수를 지정한 값과 실제로 상관 관계가 없습니다.

여기 그것이 있어야 무엇 :

foreach (KeyValuePair<string, object> parameter in outputParameters) 
{ 
    SqlParameter param = new SqlParameter(parameter.Key, parameter.Value); 
    param.Direction = ParameterDirection.InputOutput; 
    command.Parameters.Add(param); 
} 

command.ExecuteNonQuery(); 
+0

값이 SQL 서버에서 클라이언트로 반환되지 않기 때문에 입력 매개 변수가 필요 없습니다. – Rachel

+1

@Rachel - 그런 다음 Skeet이 추천 한대로 @Jon으로 InputOutput을 사용하십시오. 하지만 원본 게시물은 출력 만 표시했으며 그 것처럼 작동하지 않습니다. 출력은 값이 db 레이어 (이 경우 sproc)에서 가져와야 함을 나타냅니다. – JonH

+0

감사합니다! 답을 더 명확하게 표시하기 때문에 이것을 대답으로 표시하십시오. – Rachel