2008-10-29 5 views
3

3 개의 OUTPUT 매개 변수가있는 SQL proc를 호출합니다. proc를 호출 한 후 params 중 하나가 다른 두 개가 수행 할 때 값을 반환하지 않습니다. 프로필러는 3 가지 값 모두가 반환되고 있음을 보여줍니다. proc 디렉토리에 다음과 같이저장 프로 시저에서 출력 매개 변수가 반환되지 않습니다.

params 객체를 파라미터는

@UsrVariableID INT OUTPUT, 
@OrganisationName NVARCHAR(256) OUTPUT, 
@Visible bit OUTPUT 

과 PROC이처럼 호출하는 코드 ...

cm.Parameters.AddWithValue("@OrganisationName", name); 
cm.Parameters["@OrganisationName"].Direction = ParameterDirection.Output; 
cm.Parameters.AddWithValue("@Visible", visible); 
cm.Parameters["@Visible"].Direction = ParameterDirection.Output; 

cm.ExecuteNonQuery(); 

name = cm.Parameters["@OrganisationName"].Value.ToString(); 
visible = bool.Parse(cm.Parameters["@Visible"].Value.ToString()); 
id = int.Parse(cm.Parameters["@UsrVariableID"].Value.ToString()); 

가 실패 PARAM은

... 선언 @OrganisationName .

나는 param이 코드에서 유형 문자열이지만 proc에서는 NVARCHAR이기 때문에 궁금합니다.

누구나 아이디어가 있습니까?

+0

당신이 실패했다고 말하면 tostring() 변환에서 에러를 던지 나 데이터를 반환하지 않습니까? SSMS에서 sproc을 실행할 때 오류없이 반환됩니까? –

+0

아마 프로 시저 자체에 오류가 있습니다. 프로 시저에 실제로'SELECT @ OrganisationName = something' 또는'SET @ OrganisationName = something'이 있습니까? – configurator

답변

5

, 내가 찾은이 더 나은 결과에 더 명시 적 단서를 제공합니다. 게시 한 경우 유형이 C# 측에 지정되어 있지 않습니다. 나는 아마 다음과 같은 것을보고 상황을 타개 할이와

SqlParameter theOrganizationNameParam = new SqlParameter("@OrganisationName", SqlDbType.NVarChar, 256); 
theOrganizationNameParam.Direction = ParameterDirection.Output; 
cm.Parameters.Add(theOrganizationNameParam); 
cm.ExecuteNonQuery(); 
name = theOrganizationNameParam.Value; 

당신은하지 않고 예외가 발생되는 속성에 액세스 할 수 있습니다 때문에 출력 paratmer 올바른 데이터 유형이 보장 할 수 있습니다.

희망 사항.

+0

그것은 Briliant, 고마워요 : D 조 – user1010572

2

매개 변수를 먼저 선언하고 (값을 설정 한 후) 이것이 효과가 있는지 확인할 수 있습니다.

cm.Parameters.Add["@OrganisationName", SqlDbType.NVarChar, 256].Direction = ParameterDirection.Output 
cm.Parameters["@OrganisationName"].Value = name 

하지만 내게는 게시 한 내용이 잘못 표시되지 않습니다.

우연히도 .Parse (.ToString())가 필요하지 않으면 캐스팅 만하면됩니다. > 오라클은 당신이 문자열 버퍼 크기를 지정해야합니다 -

visible = bool.Parse(cm.Parameters["@Visible"].Value.ToString());

내가 MS SQL에 대해 잘 100 % 합니다만, .NET에서

visible = (bool)cm.Parameters["@Visible"].Value;
1

된다. 가변 길이 데이터 유형 (NVARCHAR, VARCHAR 등)이 출력 매개 변수와

cm.Parameters["@OrganisationName"].Size = 256; 
+0

뭔가있을 수 있습니다. 나는 ado.net에 익숙하지 않다. 그러나 과거에 ADO를 사용해 보았을 때 나는 이것을 사용했다 : Set adoParam = .CreateParameter ("account_number", adVarChar, adParamInput, 20). 여기서 20은 크기입니다. –

0

모두에게 감사드립니다. Ady와 Scott이 명시 적으로 매개 변수 선언에서 유형을 선언하여 제안했듯이. 더 간결한대로 Scotts 응답을 선택했습니다.

0

사실,이 유형을 선언에 대해 아니에요 -이

더 많은 정보를 원하시면 여기에 마지막 코멘트를 참조하십시오 작동합니다.

다양한 크기의 출력 매개 변수의 경우 매개 변수 크기를 지정해야합니다.

cm.Parameters["@OrganisationName"].Size = 50; 

특정 데이터 유형에 대해 크기가 지정되지 않은 경우 예외가 발생하는 구현 버그가있었습니다.

모든 것이 nvarchar (max)와 같이 알 수없는 크기의 매개 변수를 반환하는 데 적합하지 않습니다. 출력 매개 변수를 통해 SELECT 대신 반환 값을 추천합니다.

0

네, 여기 많은 것들을 시도했지만 작동하는 유일한 것은 : 문자열의 크기를 지정해야합니다.

나는 캐릭터 NVARCHAR (7)에 반환 된 StoredProcedure가 있으며 C# 1 .NET 측 나는 크기 = 255 지정된 나 7 개 문자 스트링을 수신하기 위해이 .... 작동

코드가 더 전문적이어야하기 때문에 나는 이것을 좋아하지 않았다 ... 어쨌든 ...

관련 문제