OracleDataReader GetValue引发InvalidOperationException

时间:2019-03-13 18:57:53

标签: oracle getvalue

至少还有一个与此标题相关的线程,或者与之非常接近的线程,但这与我的特定实现不太相似,我无法在其中找到答案。 我有这个代码

<code>
List<string> lsRes = new List<string>();
OracleConnection conn = getOracleConnection();
try
{
    string sqlQuery = "select CTS.SEQ_BATCH_ID.nextval from dual connect by 
level <= " + seqCnt;
    conn.Open();
    OracleCommand cmd = new OracleCommand(sqlQuery, conn);
    cmd.CommandType = CommandType.Text;
    OracleDataReader dr;
    dr = cmd.ExecuteReader();
    while (dr.Read())
        lsRes.Add(dr.GetValue(0).ToString());
}
catch(exception e)
{ 
</code>

我在Dr.GetValue(0)上收到了InvalidOperationException。知道为什么吗?序列应该返回一个或多个数字,我正在将其转换为一个字符串,我应该使用GetOracleValue吗?仅在运行时没有预编译器或编译错误。

2 个答案:

答案 0 :(得分:0)

我不确定代码是哪种语言,但是我认为问题可能出在CONNECT BY子句上。我怀疑您是否可以使用该命令按顺序执行您想要的操作。一个序列每次执行将返回一个值。如果只有一个值,则没有任何可连接的。

编辑:Whoops并不知道序列的CONNECT BY技巧。因此,只要您具有权限,SQL就应该可以正常运行。不知道您使用的是哪种语言,但是我不认为这应该被标记为Oracle。

答案 1 :(得分:0)

我没有使用OracleDataReader解决问题,但确实设法解决了问题。

List<string> lsRes = new List<string>();
OracleConnection conn = getOracleConnection();
try
{
    DataTable dtValue = new DataTable("ID");
    string sqlQuery = "select  CTS.SEQ_BATCH_ID.nextval from dual connect by level <= 
    " + seqCnt;
    conn.Open();
    OracleCommand cmd = new OracleCommand(sqlQuery, conn);
    cmd.CommandType = CommandType.Text;
    OracleDataAdapter orada = new OracleDataAdapter(cmd);
    orada.Fill(dtValue);
    orada.Dispose();
    cmd.Dispose();

    if (dtValue != null && dtValue.Rows != null && dtValue.Rows.Count > 0 )
        foreach (var item in dtValue.Rows)
            lsRes.Add(((System.Data.DataRow)item).ItemArray[0].ToString());
}
catch
{