1

タイプ「SYS_REFCURSOR」の OUT パラメータを介して結果セットを返す Oracle のストアド プロシージャがあります。

この結果セットの列情報を 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データ型に関する情報はありません(列名、null可能性、長さなどはわかります)。取得する型情報のみが、列をマップできる CLR 型です。

OUT参照カーソルを介して返された結果セットの列情報を取得するためのより良い方法がありますか?

4

1 に答える 1

2

Ok, I managed to find a solution. Each column in the result set is represented by a DataRow in the DataTable returned by reader.GetSchemaTable(). One column in this row is 'ProviderType'. The value for this column is an indicator of the column's data type. The value in this column needs to be used together with the table returned by a call to DbConnection.GetSchema("DataTypes"). The 'DataTypes' collection has a mapping of 'ProviderType->sql type'.

For SQL server there is an additional column 'DataTypeName' which gives the sql type for the column in the result set, but for Oracle you need to make an additional call to connection.GetSchema("DataTypes") and setup a dictionary of providertype->sqltype and then obtain the sql type for each column in the result set.

于 2012-02-13T14:22:31.693 に答える