Действительно ли параметр курсора должен быть объявлен иначе, чем «обычный» параметр? - PullRequest
0 голосов
/ 29 марта 2012

ОК, похоже, никто не знает, как решить проблему. Я зацикливаюсь на курсоре / наборе результатов для хранения в List, поэтому я собираюсь разбить его на части и попытаться пролистать его таким образом. , Итак, прежде всего:

Я добавляю параметры SQL в объект OracleCommand следующим образом (работает нормально):

cmd.Parameters.Add("ABCID", _ABCID);
cmd.Parameters["ABCID"].Direction = ParameterDirection.Input;
cmd.Parameters["ABCID"].DbType = DbType.String;

IOW, когда я добавляю параметр, я передаю имя параметризованной части SQL («ABCID» выше) и значение для его предоставления (_ABCID - это переменная, которая была назначена, скажем, «42»). ).

Однако при добавлении параметра Cursor (output), кажется, требуется не значение (например, объект инициализированного курсора), а просто тип данных:

cmd.Parameters.Add("cur", Devart.Data.Oracle.OracleDbType.Cursor);
cmd.Parameters["cur"].Direction = ParameterDirection.Output;

(я пробовал оба пути, и ни один не работает, так что ...?)

Истинно / таким образом, мой вопрос таков: действительно ли это правильный способ объявления параметра Cursor для вывода обратно для обхода / доступа?

Я использую новую версию компонентов DevArt DotConnect (6.80.332), VS 2010, .NET 4

Обновлен:

Вот код в другом контексте:

public void PopulateCurrentUserRoles(String AUserName, List<String> ACurrentUserRoles) { 
  _UserName = AUserName; 

  String query = "select roleid from ABCrole where ABCid = :ABCID"; 
  Devart.Data.Oracle.OracleCommand cmd = new Devart.Data.Oracle.OracleCommand(query, con); 
  cmd.CommandType = CommandType.Text; 
  int _ABCID = GetABCIDForUserName(); 

  cmd.Parameters.Add("cur", Devart.Data.Oracle.OracleDbType.Cursor); 
  cmd.Parameters["cur"].Direction = ParameterDirection.Output; 

  cmd.Parameters.Add("ABCID", _ABCID); 
  cmd.Parameters["ABCID"].Direction = ParameterDirection.Input; 
  cmd.Parameters["ABCID"].DbType = DbType.String; 
  //cmd.ExecuteNonQuery(); blows up: "illegal variable name/number" 
  //cmd.ExecuteCursor();   " " 
  //cmd.ExecuteReader();   " " 
  Devart.Data.Oracle.OracleCursor oraCursor = 
    (Devart.Data.Oracle.OracleCursor)cmd.Parameters["cur"].Value; 
  Devart.Data.Oracle.OracleDataReader odr = oraCursor.GetDataReader(); // "Object reference not set to an instance of an object" 
  while (odr.Read()) { 
    ACurrentUserRoles.Add(odr.GetString(0)); 
  } 
}

Ответы [ 2 ]

1 голос
/ 29 марта 2012

следующее из Oracle Data Provider для .NET Руководство разработчика . да, я знаю "Деварт". Тем не менее, он предлагает следующее:

  • Будьте осторожны с декларацией набора параметров.
  • добавить этот курсор / выходной параметр в коллекцию параметров перед любые другие.

Как длинный выстрел ... мой гид показывает OracleDbType.RefCursor, но не OracleDbType.Cursor. Если у DevArt есть RefCursor, попробуйте это. В Visual Studio, какой тип .NET считает этот параметр? Этот вопрос не так глуп, как я привык думать.

... С другой стороны, если для параметра задан тип OracleDbType.Char путем задания свойства OracleDbType, выходные данные возвращаются как тип OracleString. Если оба свойства DbType и OracleDbType устанавливаются до выполнения команды, последняя настройка вступает в силу.

. , .

"Приложение не должно привязывать значение к выходным параметрам; оно ответственность ODP.NET за создание объекта значения и заполнение свойство Значение OracleParameter с объектом. При связывании положение (по умолчанию) для функции, ODP.NET ожидает, что возвращаемое значение быть привязанным первым, перед любыми другими параметрами. "


EDIT:

Основано на самоответе @ Clay ... поэтому для вывода не указан параметр, достаточно просто сделать это: OracleDataReader odr = cmd.ExecuteReader();

0 голосов
/ 30 марта 2012

Прямо изо рта лошади (ребята из DevArt):

_UserName = AUserName;
// From the DevArtisans:
String query = "select roleid from ABCrole where ABCid = :ABCID";
Devart.Data.Oracle.OracleCommand cmd = new Devart.Data.Oracle.OracleCommand(query, con);
cmd.CommandType = CommandType.Text;
int _ABCID = GetABCIDForUserName();
cmd.Parameters.Add("ABCID", _ABCID);
cmd.Parameters["ABCID"].Direction = ParameterDirection.Input;
cmd.Parameters["ABCID"].DbType = DbType.String;
Devart.Data.Oracle.OracleDataReader odr = cmd.ExecuteReader();
while (odr.Read()) {
  ACurrentUserRoles.Add(odr.GetString(0));
}

По словам Кейси и Саншайн запрещены: "Вот так, Угу, ах, да, мне нравится, Угу, ах, ах";на самом деле, я терпеть не могу эту чушь, но сейчас я как-то отношусь к этому чувству.

...