c# - 为什么在尝试使用 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.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));
  }
}

我收到的错误消息会作为注释附加到它们出现的行。

最佳答案

首先,为什么要添加游标类型参数然后完全忽略它?
其次,我从未见过将游标与 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);

关于c# - 为什么在尝试使用 DotConnect 组件检索结果集时会出错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9915981/

相关文章:

C# (.NET),如何修复 Web 响应性能,耗时太多

c# - 为什么 WinForms 设计器会在其 dispose 方法中生成类似 'inconvenient' 的代码?

c# - 在 T-SQL 上解密 AES 128

sql - 在 Oracle SQL 中删除表

Oracle 和 JDBC 性能 : INSERT ALL vs preparedStatement. addBatch

c# - WPF 窗口在启动时抛出 TypeInitializationException

c# - 单元测试中的模拟与 IoC 容器

c# - 有没有一种方法可以启动Windows中提供的EventStore(根本不需要使用docker)?

c# - 如何使用用户键入的关联显示文本获取 ComboBox 的值成员?

performance - 仅包含一个值的数据库索引