2016-11-16 52 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语句并在最后添加另一个。