2016-07-22 1 views
1

id 배열이 전달되는 웹 API를 작성하고 OracleDB에서 결과를 리턴합니다.ASP .NET 웹 API에서 매개 변수 배열 전달

public class SampleController : ApiController 
{ 
    public string Getdetails([FromUri] int []id) 
    { 
     string inconditons = ""; 
     for (int i = 0; i < id.Length; i++) 
     { 
      if (i == id.Length - 1) 
      { 
       inconditons = inconditons + id[i]; 
      } 
      else 
      { 
       inconditons = inconditons + id[i] + ", "; 
      } 
     } 
     using (var dbConn = new OracleConnection("DATA SOURCE=X;PASSWORD=03JD;PERSIST SECURITY INFO=True;USER ID=IN")) 
     { 
      dbConn.Open(); 
      var strQuery = @"Select PRIO_CATEGORY_ID as PRIO,LANG_ID as LANG, REC_DATE as REC, REC_USER as RECUSER, DESCR,COL_DESCR AS COL,ROW_DESCR as DROW,ABBR from STCD_PRIO_CATEGORY_DESCR where REC_USER IN (" + inconditons + ");"; 
      var queryResult = dbConn.Query<SamModel>(strQuery); 
      return JsonConvert.SerializeObject(queryResult); 
     } 
    } 
} 

그리고 그것은 오류가 발생합니다 http://localhost:35432/api/Sample?id=1&id=83으로 API가 var에 queryResult = dbConn.Query (strQuery)에 말이라; enter image description here 그러나 사람이 하나의 매개 변수 작품으로 여기에 문제가 뭔지를 제안 해주십시오 수

var strQuery = @"Select PRIO_CATEGORY_ID as PRIO,LANG_ID as LANG, REC_DATE as REC, REC_USER as RECUSER, DESCR,COL_DESCR AS COL,ROW_DESCR as DROW,ABBR from STCD_PRIO_CATEGORY_DESCR where REC_USER =" +id ; 

작동 아래로 난 그냥 하나 개의 매개 변수를 제공합니다. 감사합니다

+0

'세부 정보보기'를 누르고 '내부 예외'속성을 확장하면보다 정확한 정보를 얻을 수 있습니다. –

+0

그것은 { "ORA-00911 : invalid character"}라고 말합니다. – trx

+1

쿼리를 수행하기 위해 연결 문자열을 사용하지 마십시오. [매개 변수가있는 쿼리] (https://blogs.msdn.microsoft.com/sqlphp/2008/09/30/how-and-why-to-use-parameterized-queries/)를 사용하십시오. 그렇지 않으면 다음과 같은 오류에 취약합니다. 이 SQL 주입 공격. – mason

답변

1

쿼리에 길잃은 문자가 없는지 확인하십시오. 코멘트

를 사용하여 매개 변수화 된 쿼리에 명시된 바와 같이

, 그렇지 않으면 당신은 이와 SQL 주입 공격과 같은 오류에 취약입니다.

id 배열을 실행할 때 매개 변수가있는 쿼리에 전달하십시오.

다음은 리팩토링 된 예제입니다.

public class SampleController : ApiController { 
    public string Getdetails([FromUri] int[] id) { 
     var inconditions = id.Distinct().ToArray(); 
     using (var dbConn = new OracleConnection("DATA SOURCE=h;PASSWORD=C;PERSIST SECURITY INFO=True;USER ID=T")) { 
      dbConn.Open(); 
      var strQuery = "SELECT PRIO_CATEGORY_ID AS PRIO, LANG_ID AS LANG, REC_DATE AS REC, REC_USER AS RECUSER, DESCR, COL_DESCR AS COL, ROW_DESCR AS DROW, ABBR FROM STCD_PRIO_CATEGORY_DESCR WHERE REC_USER IN (:p)"; 
      var queryResult = dbConn.Query<SamModel>(strQuery, new { p = inconditions }); 
      return JsonConvert.SerializeObject(queryResult); 
     } 
    } 
} 
+0

고마워요 NKosi, 문제는 조건이 var의 현재 컨텍스트에 없다고 말합니다. queryResult = dbConn.Query (strQuery, new {p = inconditions}); – trx

+0

@trx 간단한 오타입니다. 고정 – Nkosi

+0

여전히 var에 동일한 오류 ("ORA-00936 : missing expression")이 발생했습니다. queryResult = dbConn.Query (strQuery, new {p = inconditions}); – trx

1

코드가 괜찮습니다. id 배열 매개 변수가 비어 있으면 오류가 발생할 수 있습니다 (그러나 지금 보는 것과 다른 오류가 발생합니다). 코드에 중단 점을 넣고 그 값을 검사하십시오.

또한 배열을 문자열로 변환하는 경우 String.Join 메서드를 사용할 수 있습니다.

var ids = String.Join(",",id); 

은 int 배열을 가정하고 3 개 항목, 1,3- 및

5 지금 당신은 당신의 쿼리 문자열 변수를 사용할 수 있으며, "1,3,5" 같은 결과를 줄 것이다. 또한이 데이터를 매개 변수로 전달할 수도 있습니다.

var q= " ... where REC_USER IN (@ids);" //Please fill the missing part of query 
var result = con.Query<SomeModel>(q,new { ids });