Получить информацию о столбце набора результатов, возвращаемого через параметр курсора ref - PullRequest
1 голос
/ 03 февраля 2012

У меня есть хранимая процедура в Oracle, которая возвращает набор (ы) результатов через параметр (ы) OUT типа 'SYS_REFCURSOR'.

Мне нужно получить информацию о столбце этого набора результатов через 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?

1 Ответ

2 голосов
/ 13 февраля 2012

Хорошо, мне удалось найти решение.Каждый столбец в результирующем наборе представлен DataRow в DataTable, возвращаемом reader.GetSchemaTable ().Один столбец в этой строке - «ProviderType».Значением этого столбца является индикатор типа данных столбца .Значение в этом столбце необходимо использовать вместе с таблицей, возвращаемой при вызове DbConnection.GetSchema ("DataTypes").Коллекция DataTypes имеет отображение «ProviderType-> sql type».

Для сервера SQL существует дополнительный столбец «DataTypeName», в котором указывается тип sql для столбца в наборе результатов, но для Oracle необходимо выполнить дополнительный вызов connection.GetSchema («DataTypes») иустановить словарь провайдера-> sqltype, а затем получить тип sql для каждого столбца в наборе результатов.

...