获取通过ref cursor参数返回的结果集的列信息

时间:2012-02-03 17:09:39

标签: c# oracle stored-procedures ado.net sys-refcursor

我在Oracle中有一个存储过程,它通过类型为'SYS_REFCURSOR'的OUT参数返回结果集。

我需要通过ADO.NET获取此结果集的列信息。我通过创建参数(OracleParameter.OracleDbType = OracleDbType.ReCursor等)并调用'OracleCommand.ExecuteReader'(CommandBehavior.SchemaOnly)来执行存储过程。然后我在结果阅读器上调用'reader.GetSchemaTable'来获取描述结果集模式的DataTable。

OracleCommand command = oracleConnection.CreateCommand();
command.CommandText = "ProcedureName";
command.CommandType = System.Data.CommandType.StoredProcedure;

OracleParameter refParameter = command.CreateParameter();
refParameter.Name = "refCursorParam";
refParameter.Direction = System.Data.ParameterDirection.Output;
refParameter.OracleDbType = OracleDbType.ReCursor;
command.Parameters.Add(dbParameter);

var reader = command.ExecuteReader(System.Data.CommandBehavior.SchemaOnly);
var dataTable = reader.GetSchemaTable();

我的问题是结果集中每列的信息都不完整。我没有关于列的oracle数据类型的信息(我确实得到了列名,可空性,长度等)。我得到的只有类型信息是列可以映射到的CLR类型。

我做错了什么或是否有更好的方法来获取通过OUT引用光标返回的结果集的列信息?

1 个答案:

答案 0 :(得分:2)

好的,我设法找到了解决方案。 结果集中的每一列都由reader.GetSchemaTable()返回的DataTable中的DataRow表示。此行中的一列是“ProviderType”。此列的值为indicator of the column's data type。此列中的值需要与调用DbConnection.GetSchema(“DataTypes”)返回的表一起使用。 'DataTypes'集合具有'ProviderType-> sql type'的映射。

对于SQL Server,还有一个附加列'DataTypeName',它为结果集中的列提供sql类型,但对于Oracle,您需要另外调用connection.GetSchema(“DataTypes”)并设置字典of providertype-> sqltype,然后获取结果集中每列的sql类型。