2017-01-20 37 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);