2010-06-18 9 views
0

나는 C#에서 해시 테이블에서 동적으로 SQL 문을 어디서 만들길 원한다.SQL Server에서 where 절을 작성하는 방법은 무엇입니까?

hash_table의 키는 삽입 할 열의 이름이고 hash_table의 값은 value가됩니다.

string sql_1="SELECT COL_1,COL_2 FROM MY_TABLE"; 
string sql_2="SELECT * FROM MY_TABLE WHERE COL_3='ABC'"; //note: some statment have where clause while some do NOT have. 

string sql= ToSql(sql_1,myHashTable); // the actual sql statment will be returned from ToSql 
//execute sql 
sql= ToSql(sql_2,myHashTable); // 
//execute sql 

내 질문은 어떻게 LINQ에서 ToSql() 함수를 만들 수 있습니까?

참고 : 해시 테이블 값의 데이터 형식이 고려됩니다.

미리 감사드립니다. 물론

답변

3
var q = String.Join(" AND ", myHashTable.Select(x => x.Key.ToString() + " = " + 
    (x.Value is string ? "'" : "") + x.Value.ToString() + 
    (x.Value is string ? "'" : ""))) 

당신은 추가할지 여부를 결정해야 할거야은 "WHERE", "AND", 최초의 "WHERE"추가하기 전에 절 일부 "BY GROUP"을 벗겨, 그리고 이스케이프 처리해야 ,하지만 당신이 그걸 감당할 수 있다고 믿습니다.

그러나 강력하게은 매개 변수가있는 쿼리를 사용하고 SqlCommand에 매개 변수를 추가 할 것을 제안합니다. 다음과 같이 입력하십시오 :

var q = String.Join(" AND ", myHashTable.Select(x => x.Key.ToString() + " = @" + 
    x.Key.ToString())); 

var parameters = myHashTable.Select(x => new SqlParameter("@" + x.Key.ToString(), 
    x.Value)); 
+0

제안 해 주셔서 감사합니다. 하지만 매개 변수화 된 쿼리를 사용하는 것은 가능하지 않습니다. 매개 변수의 수가 전달 될 때만 런타임에 알 수 있기 때문에 일부 추가 코드가 필요합니다. 그런데 LINQ에서 Hashtable에 액세스 할 수 있습니까? – Kai

+1

@Kai, 매개 변수가있는 쿼리는 여전히 런타임에서 사용자 지정 쿼리입니다. 매우 귀중한 보안 기술인 매개 변수를 올바르게 벗어나려는 번거 로움을 덜어줍니다. –

+0

@ W.Craig Trader, 나를 고쳐 주셔서 고마워.하지만, 난 이미 이것을 처리 할 수있는 함수를 가지고 있고, 나는 이것에 SQL 문을 전달해야한다. – Kai

관련 문제