2017-01-20 39 views
0

我有一個返回REFCURSOR獲得的WebAPI get請求了REFCURSOR

TYPE TEST_LIST IS REF CURSOR; 
Procedure TestProcedure (Id IN NUMBER, Result OUT TEST_LIST) 
    IS 
    BEGIN 
    OPEN Result 
    FOR 
    SELECT distinct o.paramNumber, o.paramVArchar 
    FROM testBD o 
    WHERE o.id = Id;  
    CLOSE Result; 
    END TestProcedure; 

那麼類數據表的過程。

public class TestList 
{ 
    public long ParamNumber { get; set; } 
    public string ParamVarchar { get; set; } 

} 

和要執行的程序,然後得到數據表到一個列表,將其轉換成JSON字符串的方法:

public string GetResult(long id) 
{ 
    using (var connection = new OracleConnection()) 
    { 
     connection.ConnectionString = ConfigurationManager.ConnectionStrings["Test"].ConnectionString; 
     using (var command = connection.CreateCommand()) 
     { 

      command.CommandType = CommandType.StoredProcedure; 
      command.CommandText = $"{PackageName}.TestProcedure"; 
      parameter.Add("Id", OracleDbType.Long).Value = Id; 
      command.Parameters.Add("Result", OracleDbType.RefCursor).Direction = ParameterDirection.Output; 
      OracleDataAdapter da = new OracleDataAdapter(command); 
      ////creating and filling datatable 
      DataTable dt = new DataTable(); 
      connection.Open(); 
      da.Fill(dt); 
      connection.Close(); 
      //creating a serializer 
      System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); 
      //creating a dictionary list 
      List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>(); 
      Dictionary<string, object> row; 
      //filling list with datatable rows 
      foreach (DataRow dr in dt.Rows) 
      { 
       row = new Dictionary<string, object>(); 
       foreach (DataColumn col in dt.Columns) 
       { 
        row.Add(col.ColumnName, dr[col]); 
       } 
       rows.Add(row); 
      } 
      //returning a serialized string out of list 
      return serializer.Serialize(rows); 

     } 

    } 
} 

終於我在它與GET請求控制器

public string Get(long id) 
{ 
    return TestClass.GetResult(id); 
} 

我從中得到了一些錯誤。我需要得到一個字符串或列表在JSON中的參考光標。也許有一個更簡單的方法來做到這一點?或者我在這裏做錯了什麼?

+2

你應該告訴我們你得到了什麼錯誤。 –

+1

我可以看到的一個錯誤是你沒有做任何事情就關閉垃圾箱'CLOSE Result; ' – XING

+0

該遊標正在通過選擇返回數據。沒有錯誤的SQL程序 - 它自己做的很好 – Eve

回答

0

當您將它作爲參數傳遞出去時,請不要在存儲過程中關閉遊標。它即時關閉,WebAPI無法處理。您的使用語句確保當連接處於關閉狀態時,遊標會關閉,因爲如果沒有連接,遊標將無法存活。

0

達到這一目的的方式是

Result = from row in dt.AsEnumerable() 
              select new 
              { 
               param1 = (string)row["PARAMNUMBER"], 
               param2 = (string)row["PARAMVARCHAR"] 
              }; 
string json = JsonConvert.SerializeObject(Result, Formatting.None);