2016-11-16 10 views
0

4つの入力パラメータを使用してWeb APIを作成しています。入力パラメータはSelect文のwhere句で使用されます.OracleのフィールドはROOM (Varchar),SUBMIT_DATE(Date)(eg:01-JAN-16)です。 URLは `/ api/TGSSampleDatas?Room = 654 & SUBMITDATE = '01 -Jan-16 'のようなものでなければなりません。だから、C#で、私はシオマネキ {"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 hereOracle APIを照会するための入力パラメータを取得するWeb API

+1

重複した質問は、ここで解決策を見つけることができます:http://stackoverflow.com/questions/11862069/optional-parameters-in-asp-net-web-api – Turrican

+0

私は/ api/TGSSampleDatasを試してみると? = 654&SUBMITDATE = 01-Jan-16エラーです。「Oracle.ManagedDataAccess.Client.OracleExceptionタイプの例外がOracle.ManagedDataAccess.dllで発生しましたが、ユーザーコードで処理されませんでした。」 – trx

+0

これは実際のエラーではありません。スタックトレース。 –

答えて

1

にSQL文が間違っている中で、以下のエラーを取得

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; 

のようにGETアクションとコントローラーを作成しています。あなたは、文字列連結の使用していた(をではなくください)あなたは'とそれを囲む必要がありますので、もし

"SELECT * from LIMS_SAMPLE_RESULTS_VW where ROOM = " + ROOM +"and SUBMIT_DATE =" +"'"+SUBMITDATE+"'"; 
//--------------------------------no ticks-^----^ -no space--^ 
  • ルームは、それ以外の場合は、文の一部となり、文字列です。
  • また、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ステートメントを終了し、最後に別のステートメントを追加することができます。

関連する問題