【发布时间】: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