好吧,似乎没有人知道如何解决我通过游标/结果集循环访问存储到列表中的问题,所以我打算将它分解成几部分,并试图通过这种方式来琢磨。所以,首先:是否真的要将游标参数声明为与“常规”参数不同?
我添加SQL参数到OracleCommand对象这种方式(正常工作):
cmd.Parameters.Add("ABCID", _ABCID);
cmd.Parameters["ABCID"].Direction = ParameterDirection.Input;
cmd.Parameters["ABCID"].DbType = DbType.String;
督察,当我添加帕拉姆,我传递的参数化部分的名称SQL(上面的“ABCID”)和赋予它的值(_ABCID是已分配的变量,比方说,“42”)。
然而,添加一个光标(输出)PARAM时,它似乎想,而不是一个值(如初始化的光标对象),而是简单的数据类型:
cmd.Parameters.Add("cur", Devart.Data.Oracle.OracleDbType.Cursor);
cmd.Parameters["cur"].Direction = ParameterDirection.Output;
(我尝试这两种方式,并且都没有工作,所以...?)
实际上/因此,我的问题是:这真的是正确的方式来声明一个光标参数输出回遍历/访问?
我使用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));
}
}
你为什么使用游标?游标是(通常)在SQL中可以做的最糟糕的事情?我建议在SQL AND/OR中使用WHILE循环重新查看。请记住,SQL是基于SET的逻辑,而不是程序性的。如果你循环繁琐,那么你应该在你的代码中这样做,而不是SQL – 2012-03-29 17:28:48
“没有人工作”并不能真正解释你在尝试时观察到的内容...... – 2012-03-29 17:29:37
@Jon:如果我调用ExecuteNonQuery() - 这似乎是共识,虽然它对我来说没有意义,因为我的SQL语句是查询(Select) - 我得到“非法变量名称/数字”。我调用GetDataReader() – 2012-03-29 18:58:19