Тип безопасной привязки к хранимой процедуре Oracle в C #? - PullRequest
4 голосов
/ 01 сентября 2009

Мы разворачиваем несколько проектов на C # с базами данных Oracle. Я хотел бы реализовать всю логику базы данных в хранимых процедурах Oracle, как это

  • сохраняет всю логику базы данных в базе данных
  • упрощает поддержку при изменении структуры базы данных
  • упрощает повторное использование хранимых процедур в разных языках программирования

У меня запущен тестовый код, в котором я возвращаю строки, используя SYS_REFCURSOR, и я вручную связываю данные с результатами, поскольку SYS_REFCURSOR может возвращать что угодно - т. Е. Это не безопасный тип

У меня вопрос: есть ли способ определить правильные типы в типе возвращаемого значения хранимой процедуры и правильно привязать этот тип в моем коде C #?

например. моя процедура PL / SQL выглядит следующим образом - возвращаемая часть не является типобезопасной - это может быть что угодно. Если я захочу повторно использовать его из другого пакета Oracle, он не будет правильно проверять тип

PROCEDURE get_risk (p_process_id IN NUMBER, p_risk OUT sys_refcursor);

и мой код на C # выглядит примерно так: Я собрал это вместе из нескольких классов, так что, надеюсь, это имеет смысл. Когда я извлекаю данные из вызова БД, я вручную определяю типы данных - мне нужно знать в коде C #, что такое типы данных Oracle

// setup procedure call
_oracleCommand = new OracleCommand("risk_pkg.get_risk", _conn.OracleConnection);
_oracleCommand.Parameters.Add(new OracleParameter("p_process_id", OracleDbType.Int64, processId, ParameterDirection.Input));
_oracleCommand.Parameters.Add(new OracleParameter("p_risk", OracleDbType.RefCursor, null, ParameterDirection.Output));

_oracleDataAdapter = new OracleDataAdapter(_oracleCommand);
_dataSet = new DataSet();

// call Oracle
_oracleDataAdapter.Fill(_dataSet);

// extract data - hand coded binding
Int64 dbRiskId = (Int64)_dataSet.Tables[0].Rows[0][_dataSet.Tables[0].Columns["risk_id"]];
Int64 dbClientId = (Int64)_dataSet.Tables[0].Rows[0][_dataSet.Tables[0].Columns["client_id"]];

return new Risk(dbRiskId, dbClientId);

Это не обязательно проблема - я просто хочу знать, есть ли лучший способ сделать это, чтобы сделать мой PL / SQL более понятным в том, что он возвращает, и чтобы мой код на C # не знал Oracle типы данных - инкапсуляция меня от изменений структуры базы данных

Принятое решение: похоже, это практическое решение. Я все еще немного недоволен тем, что моя процедура Oracle не определяет явно тип возвращаемого значения, но что жизнь

Ответы [ 2 ]

2 голосов
/ 01 сентября 2009

(Вы должны опубликовать образец своего кода для тестирования. Потому что я не уверен, правильно ли я понимаю ваш вопрос.)

Возвращаемый тип - Object для обслуживания любого возможного возвращаемого значения. Вы должны конвертировать его вручную. Но вы можете сгенерировать код для преобразований. Определите таблицу или файл с этой метаинформацией: какая хранимая процедура возвращает, какие типы и в какие типы .Net они должны быть преобразованы. Используйте эту метаинформацию для создания кода C #.

Мы заполняем наши RefCursors в DataTable. Код для назначения полей таблицы соответствующим переменным-членам генерируется из наших мета таблиц.

1 голос
/ 01 сентября 2009

Я использовал текстовые шаблоны T4, чтобы сделать это с сервером SQL. Работает невероятно хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...