Привязка к выходной строке с использованием Oracle.ManagementDataAccess - PullRequest
0 голосов
/ 15 ноября 2018

Все

У меня следующий запрос:

INSERT INTO T1(CODE, NAME) VALUES(:Code, :Name) RETURNING 'Hello' INTO :NewId

Этот код работает нормально (я проверил его в sqldeveloper).

Я использовал команду Oracle из Oracle.ManagementDataAccess:

cmd.Text = @"INSERT INTO T1(CODE, NAME) VALUES(:Code, :Name) RETURNING 
'Hello' INTO :NewId";
 var codeParameter = new OracleParameter("Code", OracleDbType.Varchar2);
 codeParameter.Value = templateName;
 cmd.Parameters.Add(codeParameter);

 var nameParameter = new OracleParameter("Name", 
    OracleDbType.Varchar2);
 nameParameter.Value = reportProps.Description;
 cmd.Parameters.Add(nameParameter);

 var newIdParameter = new OracleParameter("NewId", OracleDbType.Varchar2, 
     100, System.Data.ParameterDirection.Output);
 cmd.Parameters.Add(newIdParameter);
 cmd.ExecuteNonQuery();

ExecuteNonQuery () работает нормально, но у меня есть пустой newIdParameter.Value.

Если я возвращаю целое число вместо «Hello» и меняю OracleDbType.Varchar2 с OracleDbType.Int32Я получу правильное число в newIdParameter.Value.

Что я делаю неправильно, когда привязываюсь к выходному параметру varchar2?

1 Ответ

0 голосов
/ 15 ноября 2018

Для возвращаемых значений вы должны (или должны) установить также свойство DbType, и вы должны прочитать возвращаемое значение после ExecuteNonQuery()

Правильное использование целочисленных возвращаемых значений будет выглядеть следующим образом:

var cmd = new OracleCommand("INSERT INTO T1 (NAME) VALUES(:Name) RETURNING 123 INTO :NewId", con) ) {
cmd.Parameters.Add("Name", OracleDbType.Varchar2, ParameterDirection.Input).Value = "dummy";           
cmd.Parameters.Add("NewId", OracleDbType.Int32, ParameterDirection.Output);
cmd.Parameters["NewId"].DbType = DbType.Int32;
cmd.ExecuteNonQuery();
var ret = cmd.Parameters["NewId"].Value;

Debug.WriteLine("ret = {0}", ret);

А для строки сделай так:

var cmd = new OracleCommand("INSERT INTO T1 (NAME) VALUES(:Name) RETURNING 'Hello' INTO :NewId", con) ) {
cmd.Parameters.Add("Name", OracleDbType.Varchar2, ParameterDirection.Input).Value = "dummy";           
cmd.Parameters.Add("NewId", OracleDbType.Varchar2, 30, DBNull.Value, ParameterDirection.Output);
cmd.Parameters["NewId"].DbType = DbType.String;
cmd.ExecuteNonQuery();
var ret = cmd.Parameters["NewId"].Value;

Debug.WriteLine("ret = {0}", ret);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...