【问题标题】:Getting webapi get request out of refcursor从 refcursor 获取 webapi 获取请求
【发布时间】:2017-01-20 06:45:04
【问题描述】:

我有一个返回 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;

然后是 DataTable 的类。

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

}

以及执行过程的方法,然后把DataTable变成一个list,转换成json-string:

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);

        }

    }
}

最后我有一个控制器,里面有获取请求

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

我从中得到了一大堆错误。我需要从参考游标中获取 json 中的字符串或列表。也许有更简单的方法来做到这一点?或者我在这里做错了什么?

【问题讨论】:

  • 你应该告诉我们你得到了什么错误。
  • 我可以看到的一个错误是您正在关闭 refcusor 而没有做任何事情CLOSE Result;
  • 此光标通过选择返回数据。 sql 过程中没有错误 - 它自己做得很好

标签: c# json asp.net-web-api plsql


【解决方案1】:

当您将游标作为参数传递出去时,不要关闭存储过程中的游标。它会立即关闭,WebAPI 无法处理。您的 using 语句可确保在释放连接时,游标会关闭,因为游标在没有连接的情况下将无法生存。

【讨论】:

    【解决方案2】:

    实现这一点的方法是

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

    【讨论】:

      猜你喜欢
      • 2016-06-16
      • 2019-08-10
      • 2016-04-07
      • 1970-01-01
      • 1970-01-01
      • 2017-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多