1

我在 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 ref 游标返回的结果集的列信息?

4

1 回答 1

2

好的,我设法找到了解决方案。结果集中的每一列都由 reader.GetSchemaTable() 返回的 DataTable 中的 DataRow 表示。此行中的一列是“ProviderType”。此列的值是该列数据类型的指示符。此列中的值需要与调用 DbConnection.GetSchema("DataTypes") 返回的表一起使用。“DataTypes”集合具有“ProviderType->sql 类型”的映射。

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

于 2012-02-13T14:22:31.693 回答