문제

.NET의 매개 변수화 쿼리는 항상 예에서 다음과 같습니다.

SqlCommand comm = new SqlCommand(@"
   SELECT * 
   FROM   Products 
   WHERE  Category_ID = @categoryid
", 
   conn);
comm.Parameters.Add("@categoryid", SqlDbType.Int);
comm.Parameters["@categoryid"].Value = CategoryID;

그러나 나는 다음을 시도하는 벽돌 벽으로 달려 가고 있습니다.

SqlCommand comm = new SqlCommand(@"
   SELECT * 
   FROM   Products 
   WHERE  Category_ID IN (@categoryids) 
      OR  name LIKE '%@name%'
", 
   conn);
comm.Parameters.Add("@categoryids", SqlDbType.Int);
comm.Parameters["@categoryids"].Value = CategoryIDs;
comm.Parameters.Add("@name", SqlDbType.Int);
comm.Parameters["@name"].Value = Name;

어디에

  • CategoryIds는 "123,456,789"숫자 목록입니다 (따옴표없이)
  • 이름은 문자열, 아마도 단일 따옴표 및 기타 나쁜 캐릭터가있는 문자열입니다.

이것에 대한 올바른 구문은 무엇입니까?

도움이 되었습니까?

해결책

정수 배열에 카테고리 ID가 있고 이름은 문자열이라고 가정 해 봅시다. 트릭은 모든 카테고리 ID를 개별 매개 변수로 입력하고 이름의 퍼지 일치를 구성 할 수 있도록 명령 텍스트를 작성하는 것입니다. 전자를 수행하기 위해 루프를 사용하여 @p0 ~ @pn-1의 매개 변수 이름을 구성합니다. 여기서 n은 배열의 카테고리 ID 수입니다. 그런 다음 매개 변수를 구성하고 각 지정된 매개 변수의 값으로 관련 카테고리 ID를 사용하여 명령에 추가합니다. 그런 다음 쿼리 자체의 이름에 대한 연결을 사용하여 퍼지 검색을 이름으로 검색 할 수 있습니다.

string Name = "someone";
int[] categoryIDs = new int[] { 238, 1138, 1615, 1616, 1617,
                                1618, 1619, 1620, 1951, 1952,
                                1953, 1954, 1955, 1972, 2022 };

SqlCommand comm = conn.CreateCommand();

string[] parameters = new string[categoryIDs.Length];
for(int i=0;i<categoryIDs.Length;i++)
{
   parameters[i] = "@p"+i;
   comm.Parameters.AddWithValue(parameters[i], categoryIDs[i]);
}
comm.Parameters.AddWithValue("@name",$"%{Name}%");
comm.CommandText = "SELECT * FROM Products WHERE Category_ID IN (";
comm.CommandText += string.Join(",", parameters) + ")";
comm.CommandText += " OR name LIKE @name";

이것은 DBA를 행복하게 만드는 완전히 매개 변수화 된 쿼리입니다. 나는 이것들이 정수이기 때문에 값으로 명령 텍스트를 직접 구성하는 동안 보안 위험이 많지는 않지만 여전히 이름을 매개 변수화하는 것으로 생각됩니다. 카테고리 ID가 문자열 배열에있는 경우 쉼표에서 배열을 분할하고 각각 정수로 변환 한 다음 정수 배열에 저장하십시오.

메모: 나는 배열을 말하고 예제에서 사용하지만 반복이 다를 수 있지만 모든 컬렉션에 대해 작동해야합니다.

독창적 인 아이디어 http://www.tek-tips.com/viewthread.cfm?qid=1502614&page=9

다른 팁

SQL 매개 변수의 값에서 "%"가 필요합니다.

SqlCommand comm = new SqlCommand("SELECT * FROM Products WHERE Category_ID IN (@categoryid1, @categoryid2) OR name LIKE @name", conn);
comm.Parameters.Add("@categoryid1", SqlDbType.Int);
comm.Parameters["@categoryid1"].Value = CategoryID[0];
comm.Parameters.Add("@categoryid2", SqlDbType.Int);
comm.Parameters["@categoryid2"].Value = CategoryID[1];
comm.Parameters.Add("@name", SqlDbType.Int);
comm.Parameters["@name"].Value = "%" + Name + "%";

이 접근법은 작동하지 않습니다. 기간.

in 절은 매개 변수 자체 목록을 기대하므로 바인딩 할 때 하나 그것에 매개 변수, 당신은 통과 할 기회가 있습니다. 하나 값.

당신이 전달하려는 순환 자리 소지자의 정확한 양을 사용하여 진술 문자열을 동적으로 구축 한 다음 루프에 매개 변수를 추가하고 값을 바인딩하십시오.

이것이 올바른 방법인지 확실하지 않지만 이전에 한 방법입니다.

List Templist = 새 목록

comm.parameters.add ( "@categoryIds", sqldbtype.varchar); comm.parameters [ "@categoryIds"]. value = string.join ( ",", templist.toarray ())

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top