2016-11-16 54 views
0

我正在使用四個輸入參數創建Web API。輸入參數將在Select語句的where子句中使用。Oracle中的字段爲ROOM (Varchar),SUBMIT_DATE(Date)(eg:01-JAN-16)。 URL應該是`/ api/TGSSampleDatas?Room = 654 & SUBMITDATE = '01 -Jan-16'。因此,在C#中,我創建與獲取動作控制器像獲取輸入參數以查詢Oracle數據庫的Web API

public class TGSSampleDatasController : ApiController 
{ 
    [HttpGet] 
    public HttpResponseMessage Getdetails(string ROOM,DateTime ? SUBMITDATE = null) 
     { 
      List<OracleParameter> prms = new List<OracleParameter>(); 
      List<string> selectionStrings = new List<string>(); 
      string connStr = ConfigurationManager.ConnectionStrings["TGSDataConnection"].ConnectionString; 
     using (OracleConnection dbconn = new OracleConnection(connStr)) 
     { 
      DataSet userDataset = new DataSet(); 
      var strQuery = "SELECT * from LIMS_SAMPLE_RESULTS_VW where ROOM = " + ROOM +"and SUBMIT_DATE =" +"'"+SUBMITDATE+"'"; 
      var returnObject = new { data = new OracleDataTableJsonResponse(connStr, strQuery, prms.ToArray()) }; 
      var response = Request.CreateResponse(HttpStatusCode.OK, returnObject, MediaTypeHeaderValue.Parse("application/json")); 
      ContentDispositionHeaderValue contentDisposition = null; 
      if (ContentDispositionHeaderValue.TryParse("inline; filename=TGSData.json", out contentDisposition)) 
      { 
       response.Content.Headers.ContentDisposition = contentDisposition; 
      } 
      return response; 

提示以下錯誤:在提琴手 {"Message":"The request is invalid.","MessageDetail":"The parameters dictionary contains a null entry for parameter 'SUBMITDATE' of non-nullable type 'System.DateTime' for method 'System.Net.Http.HttpResponseMessage Getdetails(System.String, System.DateTime)' in 'TGSSampleData.Controllers.TGSSampleDatasController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter."} enter image description here

+1

重複的問題,你可以在這裏找到解決方案:http://stackoverflow.com/questions/11862069/optional-parameters-in-asp-net-web-api – Turrican

+0

@Div當我嘗試/ api/TGSSampleDatas?房間= 654&SUBMITDATE = 01-Jan-16錯誤說'在Oracle.ManagedDataAccess.dll中發生類型'Oracle.ManagedDataAccess.Client.OracleException'的異常,但未在用戶代碼中處理' – trx

+0

這不是實際的錯誤,請看你的堆棧跟蹤。 –

回答

1

你的SQL語句是錯誤的。

"SELECT * from LIMS_SAMPLE_RESULTS_VW where ROOM = " + ROOM +"and SUBMIT_DATE =" +"'"+SUBMITDATE+"'"; 
//--------------------------------no ticks-^----^ -no space--^ 
  • 房是一個字符串,所以如果你使用字符串concatination(,但不要),你應該用'括起來,否則就成了聲明的一部分。
  • ROOM和and之間也沒有空格。

真正的解決辦法是使用兩個ROOMSUBMITDATE參數。這樣做可以防止這樣的問題發生。

我猜測的參數類型,你可能需要糾正它們。就像你正在做

List<OracleParameter> prms = new List<OracleParameter>(); 
prms.Add(new OracleParameter("ROOM", OracleDbType.Varchar2, ROOM, ParameterDirection.Input)); 
prms.Add(new OracleParameter("SUBMITDATE", OracleDbType.Date, SUBMITDATE ?? System.DBNull.Value, ParameterDirection.Input)); 
// note that because you are using a nullable type as input you should pass in DBNull.Value as the value if the value is null in your c# code. 

var strQuery = "SELECT * from LIMS_SAMPLE_RESULTS_VW where ROOM = :ROOM and SUBMIT_DATE = :SUBMITDATE"; 

字符串連接,使您的系統容易受到SQL注入式攻擊,並增加了問題的SQL代碼。後者可以通過傳入一個包含'標記的值來說明。再次這樣做,你可以結束sql語句並在最後添加另一個。