2016-08-04 7 views
1

Веб-API для запроса базы данных oracle, которая получает массив строк в качестве входного параметра. Я пытаюсь использовать параметры команды, чтобы избежать инъекции SqL, но приведенный ниже код не вызывает никакой ошибки, но не дает результата.Web API с использованием параметров команды не возвращает никаких данных

public class PDataController : ApiController 
{ 
    public HttpResponseMessage Getdetails([FromUri] string[] id) 
    { 

     List<OracleParameter> prms = new List<OracleParameter>(); 
     string connStr = ConfigurationManager.ConnectionStrings["PDataConn"].ConnectionString; 
     using (OracleConnection dbconn = new OracleConnection(connStr)) 
     { 
      var inconditions = id.Distinct().ToArray(); 
      var srtcon = string.Join(",", inconditions); 
      DataSet userDataset = new Dataset(); 
      var strQuer = @"SELECT STCD_PRIO_CATEGORY_DESCR.DESCR AS CATEGORY, 
      STCD_PRIO_CATEGORY_DESCR.SESSION_NUM AS SESSION_NUMBER, 
      Trunc(STCD_PRIO_CATEGORY_DESCR.START_DATE) AS SESSION_START_DATE, 
      STCD_PRIO_CATEGORY_DESCR.START_DATE AS SESSION_START_TIME 
      FROM STCD_PRIO_CATEGORY_DESCR 
      WHERE STCD_PRIO_CATEGORY_DESCR.STD_REF("; 
      StringBuilder sb = new StringBuilder(strQuery); 
      for(int x = 0; x < inconditions.Length; x++) 
      { 
       sb.Append(":p" + x + ","); 
       OracleParameter p = new OracleParameter(":p" + x,OracleDbType.NVarchar2); 
       p.Value = inconditions[x]; 
       prms.Add(p); 
      } 
      if(sb.Length > 0) sb.Length--; 
      strQuery = strQuery + sb.ToString() + ")"; 
      using (OracleCommand selectCommand = new OracleCommand(strQuery, dbconn)) 
      { 
       selectCommand.Parameters.AddRange(prms.ToArray()); 
       using (OracleDataAdapter adapter = new OracleDataAdapter(selectCommand)) 
       { 
        DataTable selectResults = new DataTable(); 
        adapter.Fill(selectResults); 
        var returnObject = new { data = selectResults }; 
        var response = Request.CreateResponse(HttpStatusCode.OK, returnObject, MediaTypeHeaderValue.Parse("application/json")); 
        ContentDispositionHeaderValue contentDisposition = null; 
        if (ContentDispositionHeaderValue.TryParse("inline; filename=ProvantisStudyData.json", out contentDisposition)) 
        { 
         response.Content.Headers.ContentDisposition = contentDisposition; 
        } 
        return response; 
       } 
      } 

     } 
    } 
} 

Ниже то, что я получаю во время отладки в CommandText из SelectCommand

"SELECT \r\n STCD_PRIO_CATEGORY_DESCR.DESCR AS CATEGORY, \r\n 
STCD_PRIO_CATEGORY_DESCR.SESSION_NUM AS SESSION_NUMBER, \r\n 
Trunc(STCD_PRIO_CATEGORY_DESCR.START_DATE) AS SESSION_START_DATE, \r\n 
STCD_PRIO_CATEGORY_DESCR.START_DATE AS SESSION_START_TIME \r\n 
FROM \r\n 
STCD_PRIO_CATEGORY_DESCR \r\n 
WHERE \r\n 
STCD_PRIO_CATEGORY_DESCR.STD_REF IN(SELECT \r\n 
STCD_PRIO_CATEGORY_DESCR.DESCR AS CATEGORY, \r\n 
STCD_PRIO_CATEGORY_DESCR.SESSION_NUM AS SESSION_NUMBER, \r\n 
Trunc(STCD_PRIO_CATEGORY_DESCR.START_DATE) AS SESSION_START_DATE, \r\n 
STCD_PRIO_CATEGORY_DESCR.START_DATE AS SESSION_START_TIME \r\n 
FROM \r\n 
STCD_PRIO_CATEGORY_DESCR \r\n 
WHERE \r\n 
STCD_PRIO_CATEGORY_DESCR.STD_REF IN(:p0)" 

Поскольку я даю себе

strQuery = strQuery+ sb.ToString() + ")"; 

Выбрать, повторяется. Но если я просто дать

strQuery = sb.ToString() + ")"; 

В то время как strQuery во время отладки

SELECT \r\n STCD_PRIO_CATEGORY_DESCR.DESCR AS CATEGORY, \r\n 
STCD_PRIO_CATEGORY_DESCR.SESSION_NUM AS SESSION_NUMBER, \r\n 
Trunc(STCD_PRIO_CATEGORY_DESCR.START_DATE) AS SESSION_START_DATE, \r\n 
STCD_PRIO_CATEGORY_DESCR.START_DATE AS SESSION_START_TIME \r\n 
FROM \r\n 
STCD_PRIO_CATEGORY_DESCR \r\n 
WHERE \r\n 
STCD_PRIO_CATEGORY_DESCR.STD_REF IN(:p0) 

enter image description here

Что я получаю взамен это

{"data":[]} 

Должен ли я заключить p0 в '' потому что вход, который мы получаем, представляет собой массив строк.

Но тот же идентификатор, когда я пытаюсь в SQL-разработчике, получаю записи. любая помощь очень ценится.

+0

что ваш 'id' параметр? как выглядит сгенерированный SQL-запрос перед его выводом? – shirbr510

+0

ID - строка, которую мы даем при вызове API, сгенерированный запрос должен быть чем-то вроде Select * from STCD, где STDREF IN ('a001', 'a002'), если мы вызываем API как http: // local host: 80/API/PData? Id = 'a001' & I would = 'a002' – user4912134

+0

Я знаю. Я прошу пример вашего запроса GET. для экземпляра: 'http://example.com/api/somecontroller/getdetails?id=1&id=2&id=3& id = 4' – shirbr510

ответ

1

Из чата с OP выяснилось, что OP добавляет одиночные кавычки вокруг идентификатора параметра массива. Значения, где полученные от строки запроса, отформатированной таким образом

http:// localhost:80/api/PData?id='JW217T_01' 

и это была попытка передать строку в качестве значения параметра.

Однако, если вы используете параметр и указываете его тип данных (NVarChar2), то механизм базы данных достаточно знает о значении для правильного цитирования, поэтому значения параметров не должны иметь одинарных кавычек вокруг них.

Изменение формата строки запроса в

http:// localhost:80/api/PData?id=JW217T_01 

Устранена проблема