2016-08-03 3 views
0

Wir erstellten die Web-API für die Abfrage der Oracle-DB, die das Ergebnis im folgenden Format in der JSON-Datei zurückgab. Damit erhält die API das Array der Eingabeparameter. Da das Abfrageergebnis für die folgende Abfrage so groß ist, gibt es 313568 zurück, wenn wir es im SQL Developer versuchen.Ausnahme des Typs 'System.OutOfMemoryException' wurde ausgelöst WEB-API

SELECT * von STCD_PRIO_CATEGORY wo STPR_STUDY.STD_REF IN ("BL001, TM002")

Im Folgenden wird der Code wir

public HttpResponseMessage Getdetails([FromUri] string[] id) 
{ 
    string connStr = ConfigurationManager.ConnectionStrings["ProDataConnection"].ConnectionString; 
    using (OracleConnection dbconn = new OracleConnection(connStr)) 
    { 
     var inconditions = id.Distinct().ToArray(); 
     var srtcon = string.Join(",", inconditions); 
     DataSet userDataset = new DataSet(); 
     var strQuery = @"SELECT * from STCD_PRIO_CATEGORY where STPR_STUDY.STD_REF IN(" + srtcon + ")"; 
     using (OracleCommand selectCommand = new OracleCommand(strQuery, dbconn)) 
     { 
      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; 

verwenden Wenn ich die URL bin mit https://bhbl.abc.org/api/Sample?id= & 'BL001' id = ‚TM002‘ für die DB als Abfrage enter image description here

Aber wenn ich die URL https://bhbl.abc.org/api/Sample?id= ‚BL001‘ verwenden es gibt Ergebnis, das j Ust 41552 Datensätze

Wie API erstellen, die eine große Menge an Daten zurückgibt. Jede Hilfe wird sehr geschätzt

Antwort

2

Dies ist, weil API zurückgegebene Daten zu groß ist, der Prozess, Speicherüberlauf zu erzeugen. Sie müssen die Paging-SQL verwenden:

SELECT * 
    FROM (SELECT a.*, ROWNUM rn 
      FROM (SELECT * 
        FROM table_name) a 
     WHERE ROWNUM <= 40) 
WHERE rn >= 21 

Kunde proccess einmal, mehrere Anrufe api, komplett alle Datenerfassung.

Der Client Kern-Code unten:

// ids: 'BL001' 'TM002', next_key: paging record index 
while (next_key != null) 
{ 
    next_key = GetDetails(ids, next_key); 
} 

private string GetDetails(stirng[] ids, string next_key) 
{ 
    // call api 
    var result = ...; 

    // parse api reponse result 
    object key = result.next_key; 
    if (key == null) return null; 
    string s = key.ToString(); 
    return string.IsNullOrEmpty(s) ? null : s; 
} 

Der Server Core-Code unten:

public HttpResponseMessage Getdetails([FromUri] string[] id, [FromUri] string next_key) 
{ 
    // use paging sql 
    // excute sql return record count 
    var count = ... 

    // return next_key 
    if (count < 20) 
    { 
     result.next_key = null; 
    } 
    else 
    { 
     result.next_key = (int.Parse(next_key) + 20).ToString(); 
    } 

    return result; 
} 
+0

Können wir dies tun, ohne Paging? Weil der Client sofort nach dem Ergebnis sucht – trx

+0

@trx Client process einmal, mehrere Anrufe api, vervollständigen alle Datenerfassung. –

Verwandte Themen