是否真的要声明游标参数而不是“常规”参数?

时间:2012-03-29 17:22:48

标签: c# oracle devart dotconnect

好吧,似乎没有人知道如何解决问题我已经通过光标/结果集循环存储到List中,所以我要把它分解成碎片并尝试以这种方式闯入它。所以,首先:

我以这种方式将SQL参数添加到OracleCommand对象(工作正常):

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

IOW,当我添加param时,我传递了SQL的参数化部分的名称(上面的“ABCID”)和一个给它的值(_ABCID是一个已经分配的变量,让我们说,“42” )。

但是,在添加Cursor(输出)参数时,它似乎想要的不是值(例如初始化的光标对象),而只是数据类型:

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

(我试过两种方式,但都没有,所以......?)

Verly /因此,我的问题是:这是否真的是声明要为遍历/访问输出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 个答案:

答案 0 :(得分:1)

以下内容来自 Oracle Data Provider for .NET Developer's Guide 。是的,我知道,“Devart”。尽管如此,它提出了以下建议:

  • 请注意参数输入声明。
  • 将该游标/输出参数添加到之前的Parameters集合中 任何其他人。

作为一个长镜头...我的指南显示OracleDbType.RefCursor但不是OracleDbType.Cursor。如果DevArt有RefCursor,试试吧。在visual studio中,.NET认为该参数是什么类型的?这个问题并不像我以前那么愚蠢。

  

...另一方面,如果通过设置OracleDbType属性将参数设置为OracleDbType.Char类型,则返回输出数据   作为OracleString类型。如果同时具有DbType和OracleDbType属性   在命令执行之前设置,最后一个设置生效。

     

。 。

     

“应用程序不应绑定输出参数的值;它是   ODP.NET负责创建值对象并填充   带有对象的OracleParameter Value属性。绑定时   位置(默认)为函数,ODP.NET期望返回值为   在任何其他参数之前先绑定。“


修改

基于@ Clay的自我回答...所以没有为输出指定参数,而只是这样做:OracleDataReader odr = cmd.ExecuteReader();

答案 1 :(得分:0)

直接从马的嘴里(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));
}

引用Casey和Sonshine Banned,“就是这样,嗯嗯嗯,我喜欢它,嗯嗯嗯嗯”;实际上,我无法忍受那种废话,但我现在对这种情绪有点了解。