【发布时间】:2012-04-13 09:23:50
【问题描述】:
好的,似乎没有人知道如何解决我在循环游标/结果集以存储到列表中时遇到的问题,所以我将把它分解成碎片并尝试以这种方式解决它.所以,首先:
我以这种方式将 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(输出)参数时,它似乎想要的,不是一个值(例如一个初始化的游标对象),而只是数据类型:
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 中可以做的最糟糕的事情?我建议使用 WHILE 循环重新查看 SQL AND/OR。请记住,SQL 是基于 SET 的逻辑,而不是过程。如果你循环很多,那么你应该在你的代码中这样做,而不是 SQL
-
“两者都不起作用”并不能真正解释您在尝试时观察到的情况......
-
@Jon:如果我调用 ExecuteNonQuery() - 这似乎是共识,虽然这对我来说毫无意义,因为我的 SQL 语句是一个查询(选择) - 我得到,“非法变量姓名/号码”。如果我将 ExecuteNonQuery() 注释掉,我会在调用 GetDataReader() 时得到“对象引用未设置为对象的实例”
-
@Justin:我正在尝试使用 while 循环,这就是我对 Oracle 的 ODP 组件所做的事情。我没有看到如何使用 DotConnect 组件来做到这一点。
-
@ClayShannon:你没有显示调用
GetDataReader的代码,这很难说发生了什么......
标签: c# oracle devart dotconnect