好吧,似乎没有人知道如何解决问题我已经通过光标/结果集循环存储到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));
}
}
答案 0 :(得分:1)
以下内容来自 Oracle Data Provider for .NET Developer's Guide 。是的,我知道,“Devart”。尽管如此,它提出了以下建议:
作为一个长镜头...我的指南显示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,“就是这样,嗯嗯嗯,我喜欢它,嗯嗯嗯嗯”;实际上,我无法忍受那种废话,但我现在对这种情绪有点了解。