2011-01-25 9 views
1

나는 이와 같이 많은 기능을 가지고있다. 각각은 N 개의 인수를 가지며 각 매개 변수는 이와 매우 유사한 형태의 SQLparamater 배열을 만듭니다.매개 변수를 일반적으로 액세스 할 수 있습니까?

[WebMethod] 
public static string accessServer(string dataField1, string dataField2, string dataField3) { 
    string value; 
    SQLParamater[] param = new SQLParameter[len] // len is the amount of arguments 
    param[0] = new SQLParameter("@dataField1", dataField1); 
    param[1] = new SQLParameter("@dataField2", dataField2); 
    param[2] = new SQLParameter("@dataField3", dataField3); 
    ... 

    // do something with param 

    return value; 
} 

일반적으로 리플렉션의 조합을 사용하고 일반적인 방법으로 매개 변수에 액세스 할 수있는 것처럼 보입니다.

이상적 형태

public static SQLParamater[] getParams(someType paramaters)

SQLParamater[] param = getParams(...)

하는 방법 나는 일반적으로 모든 PARAMATERS에 전달하는 방법을 모르겠어요.

이 datafields의 이름이 중요한 것을 [편집]

참고. 그것은 문자열의 배열이 아니라 키/값 쌍의 집합입니다.

[/ 편집]

+0

올바른 철자는 param_e_ter입니다. –

+0

매개 변수를 일반적으로 추가 하시겠습니까? 아니면 매개 변수에 어떤 방식 으로든 액세스 하시겠습니까? – TheVillageIdiot

답변

0

나는 당신이 필요로하는 경우, 당신은 더 나은 어떤 종류의 컬렉션을 받아들이는 방법을 것이다 당신의 API 디자인 결함 생각합니다.

이와 같은 코드 중복은 거의 모든 것을 완료하는 올바른 방법이 아닙니다.

편집

주제에

:

를 당신이 스택에서 값을 얻을 수 추측 : 당신이 호출 할 수 있도록 예를 들어, name(params string[] arguments) : 당신은 가변 인수 함수를 사용할 수 있습니다

+0

만약 WebMethods가 작동하는 방식에 제한이 없다면 나는 할 것입니다. – Raynos

+0

스택에서 값을 추출하려고 했습니까? –

+0

밝혀졌습니다. Ajax를 통해 클라이언트에서 'Dictionary'와 같은 비 기본 유형을 전달할 수 있습니다. 여기서 문제는 매개 변수를 하나씩 전달하는 것입니다. – Raynos

3
+0

매개 변수에는 키와 값이 있어야하기 때문에 옵션이 아닙니다. 나는. 매개 변수의 이름은 값뿐 아니라 중요합니다. – Raynos

+0

구조체 이름/값을 생성하지 않고 가변 인수 배열로 사용하지 않는 이유는 무엇입니까? –

+0

webmethod (중요한 정보가 될 수있는 actaulyl이 발생 함)에 나는'String' 값이 붙어 있다고 생각합니다. – Raynos

0

우리는 이런 식으로 작업을 수행합니다

var dict=new Dictionary 
      { 
       {"@param1",value1}, 
       {"@param2",value2}, 
       {"@param3",value3}, 
       {"@param4",value4}, 
       .... 
      }; 

DALayer.ExecuteProc("procName",dict); 

ExecuteProc 함수에서 Dictionary 객체를 반복하고 KeyValuePair 객체를 사용하여 매개 변수를 설정할 수 있습니다. 그러나 매개 변수에 대한 데이터 유형, 길이 등을 설정해야하는 경우 SQL 명령을 준비하여 매개 변수를 쿼리하거나 데이터 유형, 길이 및 방향 등에 대한 정보가 포함 된 매개 변수로 더 복잡한 객체를 전달하는 등의 작업을 더 많이 수행해야합니다.

1

이 질문은 이전에 물어 보았습니다. 그러나 질문은 찾을 수 없습니다. 그러나 문제는 반사식을 사용하여 매개 변수 이름을 알아낼 수는 있지만 MethodBase.GetCurrentMethod() 매개 변수 값과 함께 이름을 지울 수 없다는 것입니다. 당신이 값의 매개 변수 목록에 접근하는 방법.

매우 구체적인이 문제를 해결하기위한 다른 방법이 있지만이 방법을 권장하지는 않습니다. 단지 많은 의미를 갖지 않습니다.

static void SomeMethod(string arg1, int arg2, object arg3) 
{ 
} 

당신이 할 수있는 :이 같은 방법 주어진 지금

,

static void Main() 
{ 
    var b = 123; 
    // this now becomes necessary as it's the only way of getting at the metadata 
    // in a presumable safe manner 
    Expression<Action> x =() => SomeMethod("a", b, "a" + b); 
    var args = GetArgs(x); 
    foreach (var item in args) 
    { 
     Console.WriteLine("{0}: {1}", item.Key, item.Value); 
    } 
} 

을 그리고 GetArgs 그렇게 같은 방법을 구현 (당신은 여전히 ​​becuase 어딘가에 그 값을 넣는 방법이 필요합니다 호출이 발생하지 않음) :

static IDictionary<string, object> GetArgs(Expression<Action> x) 
{ 
    var args = new Dictionary<string, object>(); 
    var m = (MethodCallExpression)x.Body; 
    var parameters = m.Method.GetParameters(); 
    for (int i = 0; i < m.Arguments.Count; i++) 
    { 
     // an easy way of getting at the value, 
     // no matter the complexity of the expression 
     args[parameters[i].Name] = Expression 
      .Lambda(m.Arguments[i]) 
      .Compile() 
      .DynamicInvoke(); 
    } 
    return args; 
} 

다음과 같은 이름/값 쌍의 컬렉션을 추론합니다. 컴파일러에 의해 생성 된 표현식 트리, 그것은 가능하지만 이상합니다.

+0

나는 당신이 [이 질문]을 의미한다고 생각합니다. (http://stackoverflow.com/questions/4502821/how-do-i-translate-a-liststring-into-a-sqlparameter-for-a-sql-in-statement/ 4502866 # 4502866). – Oliver

+0

@Oliver - 아니, 그건 완전히 다른 것입니다. –

관련 문제