为什么我在尝试使用DotConnect组件检索结果集时出现错误?

3
使用下面的代码,我在调用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(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("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(); 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));
  }
}

我收到的错误消息被附加为注释,出现在它们发生的行下面。
1个回答

1
首先,你为什么要添加一个光标类型参数,然后完全忽略它呢?
其次,我从未见过在ExecuteReader中使用此光标,而是在ExecuteNonQuery中使用。
例如:
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);

请展示您的查询文本。如果不需要游标,请将其从参数中删除,或使用第二个示例。 - Steve
这些示例仅包含相关代码。从名称可以推断出它是在其他地方声明的 DataSet。 - Steve
我相信你已经检查过了,但是他们的网站上有详尽的文档,链接在这里 DevArt dotConnect for Oracle - Steve
抱歉 @ClayShannon,我现在要休息了。在意大利,已经过了午夜。明天见... 并发布您的查询文本... - Steve
我现在看到你的查询了。对我来说很清楚。查询中没有声明游标。删除这两行代码 cmd.Parameters.Add("cur", Devart.Data.Oracle.OracleDbType.Cursor);cmd.Parameters["cur"].Direction = ParameterDirection.Output;,然后重新启用带有 ExecuteReader() 的那一行代码。 - Steve
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接