2012-10-16 3 views
3

I는 다음과 같이 항상 코드 블록을 반복하고있다 :C#에서 가변 개수의 인수로 GetStoredProcCommand를 호출합니까? 내 코드에서

var returnData = MyDb.ExecuteDataSet(
    MyDb.GetStoredProcCommand("MyTable_Insert", columnOne, columnTwo, columnThree), 
    transaction 
); 

var returnId = (int)returnData.Tables[0].Rows[0]["INSERTED_ID"]; 

이 여러번 반복되는 코드의 상당히 큰 블록으로 나에게 보인다,하지만 난 방법을 작동하지 않을 수 있습니다 인수의 수가 각 저장 프로 시저마다 다르기 때문에이를 메소드로 일반화해야합니다.

(나에게) 확실한 해결책은 배열의 기능을 통해 내 매개 변수를 전달하고 GetStoredProcCommand 전화를 확장하는 것입니다,하지만 난이 할 수있는 방법 찾을 수 없습니다 :

private int CallStoredProcedure(string procName, List<dynamic> parameterValues) { 
    .. 
    MyDb.GetStoredProcCommand(procName, expand parameterValues); 
    // ERROR: Obviously "expand" doesn't exist 
    .. 
} 

을 나는 AddInParameter를 사용하여 매개 변수를 전달하는 긴 숨이 방법을 사용할 수 있지만 그때는 매개 변수 값과 함께 유형의 정보를 전달해야합니다 :

private int CallStoredProcedure(string procName, IDictionary<DbType, IDictionary<string, string>> paramsKeyValuesByType) { 
    .. 
    MyDb.AddInParameter(myProcCommand, param.Value.Key, param.Key, param.Value.Value); 
    .. 
} 

을하지만 그때 나는 메서드를 호출하기 전에 IDictionary 객체를 생성해야 할 것 어느 것이 원래 프로 시저를 호출하는 방법보다 훨씬 길었습니다.

아무도 이것에 우아한 해결책을 생각할 수 있습니까?

+0

을, 왜 당신은 CallStoredProcedure''에서뿐만 아니라 가변 인수를 사용하지 않을까요? 변수 인수는 확장 목록 대신 직접 전달 될 수있는 배열에 저장됩니다. – mellamokb

+0

'object'가 아닌'dynamic'을 원하십니까? –

답변

4

당신은 params 키워드를 사용할 수 있습니다 : 당신이 MyDb.GetStoredProcCommand``에서 가변 인수를 사용하는 경우

private int CallStoredProcedure(string procName, params object[] parameterValues) { 
    .. 
    MyDb.GetStoredProcCommand(procName, parameterValues); 
    .. 
} 
+0

필자는이 변수 매개 변수를 어떻게'GetStoredProcCommand'에 전달할 것인가에 대해 저에게 도움이된다고 생각하지 않습니다.'params' 키워드를 사용하여 정의 할 필요가 없습니까? 그렇게해서 그런 식으로 일할 수는 없었습니다. 나는 기쁘다. –

+2

@RobinWinslow : 아무 것도 할 필요가 없습니다. [documentation] (http://msdn.microsoft.com/en-us/library/bb748722 (v = pandp.31) .aspx)을 확인하십시오. 보시다시피,'GetStoredProcCommand' 역시'params'를 사용합니다. 그래서 그냥 작동해야합니다. 왜 그것이 효과가 없을 것이라고 생각합니까? 너 해봤 니? 어떤 오류가 있었습니까? –

+0

좋은 지적. 이 전체 params는 나를 조금 혼란스럽게 만들었지 만, 이제는 이해합니다. –

관련 문제