C# 为什么在尝试检索带有DotConnect组件的结果集时出错?

C# 为什么在尝试检索带有DotConnect组件的结果集时出错?,c#,.net,oracle,cursor,dotconnect,C#,.net,Oracle,Cursor,Dotconnect,通过下面的代码,我在调用ExecuteReader时得到“ORA-01036:非法变量名/编号”: cmd.Parameters.Add("cur", Devart.Data.Oracle.OracleDbType.Cursor); cmd.Parameters["cur"].Direction = ParameterDirection.Output; Devart.Data.Oracle.OracleCursor oraCursor = (Devart.Data.Oracle.Orac

通过下面的代码,我在调用ExecuteReader时得到“ORA-01036:非法变量名/编号”:

cmd.Parameters.Add("cur", Devart.Data.Oracle.OracleDbType.Cursor);
cmd.Parameters["cur"].Direction = ParameterDirection.Output;
Devart.Data.Oracle.OracleCursor oraCursor =
    (Devart.Data.Oracle.OracleCursor)cmd.Parameters["cur"].Value;
Devart.Data.Oracle.OracleDataReader odr = cmd.ExecuteReader();
while (odr.Read()) {
    ACurrentUserRoles.Add(odr.GetString(0));
}
我要做的是用查询结果填充一个列表。我在DevArt的文档(或谷歌搜索)中没有看到任何这样的例子。我让它与Oracle的ODP组件一起使用:

OracleDataReader odr = cmd.ExecuteReader();
while (odr.Read()) 
{
    ACurrentUserRoles.Add(odr.GetString(0));
}
…但找不到与DotConnect组件并行工作的

更新:

好的,下面是整个方法(ACurrentUserRoles是字符串列表):

public void PopulateCurrentUserRoles(字符串AUserName,列出ACurrentUserRoles){
_用户名=AUserName;
String query=“从ABCrole中选择roleid,其中ABCid=:ABCid”;
Devart.Data.Oracle.OracleCommand cmd=new Devart.Data.Oracle.OracleCommand(query,con);
cmd.CommandType=CommandType.Text;
int_ABCID=GetABCIDForUserName();
命令参数添加(“ABCID”,_ABCID);
cmd.Parameters[“ABCID”].Direction=ParameterDirection.Input;
cmd.Parameters[“ABCID”].DbType=DbType.String;
cmd.Parameters.Add(“cur”,Devart.Data.Oracle.OracleDbType.Cursor);
cmd.Parameters[“cur”].Direction=ParameterDirection.Output;
//cmd.ExecuteNonQuery();弹出:“非法变量名/编号”
//cmd.ExecuteCursor();“”
//cmd.ExecuteReader();“”
Devart.Data.Oracle.OracleCursor oraCursor=
(Devart.Data.Oracle.OracleCursor)cmd.Parameters[“cur”].Value;
Devart.Data.Oracle.OracleDataReader odr=oraCursor.GetDataReader();/“对象引用未设置为对象的实例”
while(odr.Read()){
ACurrentUserRoles.Add(odr.GetString(0));
}
}

我得到的err msg作为注释附加到它们出现的行中。

首先,为什么要添加游标类型参数,然后完全忽略它?
其次,我从未见过游标在ExecuteReader中的这种用法,而是在ExecuteOnQuery中

例如:

string cmdText = "begin open :cur for select * from dept; end;";
OracleCommand oraCommand = new OracleCommand(cmdText, oraConnection);
oraCommand.Parameters.Add("cur", OracleDbType.Cursor);
oraCommand.Parameters["cur"].Direction = ParameterDirection.Output;
oraCommand.ExecuteNonQuery();
OracleCursor oraCursor = (OracleCursor)oraCommand.Parameters["cur"].Value;
oraDataAdapter.Fill(dataSet, "Table", oraCursor);
因此,您的异常可能来自ExecuteReader的使用

这是直接取自DevArt现场的另一个示例:

string cmdText = "begin open :cur1 for select * from dept;" + 
    "open :cur2 for select * from emp; end;";
OracleCommand oraCommand = new OracleCommand(cmdText, oraConnection);
oraCommand.Parameters.Add("cur1", OracleDbType.Cursor);
oraCommand.Parameters["cur1"].Direction = ParameterDirection.Output;
oraCommand.Parameters.Add("cur2", OracleDbType.Cursor);
oraCommand.Parameters["cur2"].Direction = ParameterDirection.Output;
oraDataAdapter.SelectCommand = oraCommand;
oraDataAdapter.Fill(dataSet);

但这是一个查询,为什么要使用ExecuteNonQuery()?听起来应该是Insert、Update、Delete语句。这是一个返回1..N条记录的Select。另外,我想将查询结果添加到列表中,这就是为什么我想使用读卡器在其中循环。在上面的第一个例子中,“数据集”不知从何而来——它们是在填充网格还是什么?然后,请显示查询的文本。如果不需要游标,请将其从参数中删除,或者使用第二个示例。示例仅包含相关代码。从名称来看,我们可以假设这是在别处声明的数据集。我相信您已经检查过了,但是他们的网站上有大量的文档
string cmdText = "begin open :cur1 for select * from dept;" + 
    "open :cur2 for select * from emp; end;";
OracleCommand oraCommand = new OracleCommand(cmdText, oraConnection);
oraCommand.Parameters.Add("cur1", OracleDbType.Cursor);
oraCommand.Parameters["cur1"].Direction = ParameterDirection.Output;
oraCommand.Parameters.Add("cur2", OracleDbType.Cursor);
oraCommand.Parameters["cur2"].Direction = ParameterDirection.Output;
oraDataAdapter.SelectCommand = oraCommand;
oraDataAdapter.Fill(dataSet);