2010-06-02 9 views
1

이것은 생각할 필요가없는 것처럼 보일지도 모르지만, 바라건대 내가 내 문제를 설명하고 난 후에 왜 내가 이것을 묻고 있는지 이해할 수있을 것이다.메소드를 작성하는 메소드를 작성할 수 있습니까?

메소드와 해당 인수를 만드는 메소드를 사용할 수 있습니까?

문제 : 여러 번 모두 다른이 arent 다른 SQL 문을 호출에 내 현재 프로젝트

내가있다.

예를 들어, 나는 하나의 새로운 행을 삽입하지만 2 개의 열과 새로운 행을 삽입하는 12 개의 열만 있습니다.

는 내가 클래스라는 utils.cs를 생성하고 거기에 내가 등 박스

를 텍스트로 숫자 입력 확인 등의 검증 방법 많은 "편리한"방법을 분류 한

그래서 내가하는 대신 잘 생각 SQL을 쓰는 방법은 모든 곳에서 병이 거기에 하나를 만들 그래서 내가 가지고 내가 필요로 할 때 호출하지만 현재 다음과 같습니다 : 당신이

그래서 내가 궁금 아주 엉망 이잖아 볼 수

public static string getInsertSQL(string tablename, string colOne, string colTwo, string colThree, string colFour, string colFive, string colSix, string colSeven, string colEight, string colNine, string colTen, string colEleven, string colTwelve,bool active, string valueOne, string valueTwo, string valueThree, string valueFour, string valueFive, string valueSix, string valueSeven, string valueEight, string valueNine, string valueTen, string valueEleven) 
    { 
     string strSQL = ""; 
     strSQL += "INSERT INTO " + tablename; 
     strSQL += "(" + colOne + " " + colTwo + " " + colThree + " " + colFour + " " + colFive + " " + colSix + " " + colSeven + " " + colEight + " " + colNine + " " + colTen + " " + colEleven + " " + colTwelve + ")"; 
     strSQL += " values ("+active+", " + valueOne + " " + valueTwo + " " + valueThree + " " + valueFour + " " + valueFive + " " + valueSix + " " + valueSeven + " " + valueEight + " " + valueNine + " " + valueTen + " " + valueEleven + ")"; 

     return strSQL; 
    } 

모든 방법을 쓰는 것이 가능했습니다. 얼마나 많은 칼럼을 삽입 할 필요가 있는지에 대한 논쟁을 취한 다음, 그 많은 논점을 가진 메소드를 생성 할 수 있습니다.

나는 당신이 내가 무엇을보고 있는지 알기를 바랍니다. 사전에 모든

+1

가 왜 그냥 하나 개의 방법이 있고 <의 ColumnName, ColumnValue> 쌍의 사전에 통과? – adrianbanks

+0

좋은 질문을하지만 사전에 단서가 없다. 단 1 년째 학생이다. ^^ –

답변

3

최초의

덕분에, 이제까지 당신의 예에서와 같이 함께 값을 연결하여 SQL 문자열을 구축하지 않습니다. SQL injection attacks에 자신을 열어두고 있습니다.

대신 parameterized queries을 작성하십시오.

실제로 런타임시 메서드를 생성하거나 코드에서 일부 메타 정보를 기반으로 메서드를 생성 할 수 있습니다. 그러나 인수를 단일 메소드 (예 : 단일 메소드)로 구문 분석하여 SQL 조회를 빌드 할 수 있는지 알아볼 수도 있습니다. 열 이름 값의 사전을 전달하십시오.

여기 컬렉션을 통해 귀하의 방법 itterate에 가변 인자를 전달하기 위해, 당신은 C#을의이 VAR를 사용할 수 @adrianbanks에

public void DoQuery(string table, Dictionary<string, object> columns) 
{ 
    StringBuilder query = new StringBuilder(); 
    query.Append("SELECT "); 
    foreach (KeyValuePair<string, object> kvp in columns) 
    { 
     query.Append(kvp.Key).Append(","); // You need extra logic to not append a trailing comma. Exercise to reader ;-) 
    } 

    // Etc. Look at how to add parameters to your where clause using provided link 

} 
0

또한 과정을 설명 의사 코드의

0

하는 경우 이 작업을 수행하기를 원한다면 params KeyValuePair<string,string>[] columns을 전달하면 원하는만큼 많은 쌍 (이름/값)을 전달할 수 있으며 함수 내에서 배열로 액세스 할 수 있습니다.

그렇다면이 방법으로 SQL을 구성하지 않는 것이 좋습니다. 그것은 expoitation에 열려있어 거기에 (Linq, NHibernate, EntityFramework 등) 또는 완벽하게 좋은 프레임 워크가 많이있다하더라도 당신이 적어도 매개 변수화 된 쿼리를 사용하여 멀리 가지 않으려는 경우에도.

편집 : 당신은 당신이 사전이 무엇인지 알지 못해서 더 자세한 내용이 필요할지도 모른다고 생각했기 때문에.여기 예제 문제는이 SQL에 대한 바람직하지 경우에도 여전히 유효 주어진 것 :

public static string getInsertSQL(string tablename, params KeyValuePair<string, string>[] columns) 
{ 
    string strSQL = "INSERT INTO {0} ({1}) VALUES ({2})"; 
    string fields = String.Empty; 
    string values = String.Empty; 
    foreach (KeyValuePair<string, string> column in columns) 
    { 
    if (!String.IsNullOrEmpty(fields)) fields += ", "; 
    if (!String.IsNullOrEmpty(values)) values += ", "; 
    fields += column.Key; 
    values += "\"" + column.Value + "\""; //Highly recommend replacing with parameters, or at least SQL escaping 
    } 
    return String.Format(strSQL, tablename, fields, values); 
} 
+0

대학생을 제외하고는 특정 기술을 사용하는 것으로 제한 될 수 있습니다 ... 더 추상적 인 접근법을 배우기 전에 토대를 배우십시오. 확실하지 않다. 그러나 그렇지 않으면 100 % 동의하십시오. –

+0

사실, 아직 유니 학생에 대한 설명을 읽지 않았습니다. 그러나 언젠가 그는 언니의 임무에서 벗어날 것이며 적어도 이러한 제한 사항을 나중에 작업으로 옮기는 것이 아니라 "더 나은 방법"이 있다는 것을 적어도 알고 있어야합니다. – fyjham

+0

정말 감사드립니다. 하지만 단지 하나의 작은 질문입니다. 어떻게 함수를 호출 할 것인가? getInsertSQL (tablename,? 당신이 대답을 편집 한 이후에 그것을 시험해 보려고 애써서 죄송합니다. :) –

관련 문제