如何检索Oracle Clob超过4000个字符的ODP.NET

时间:2013-08-13 20:17:09

标签: c#-4.0 odp.net

我正在尝试通过ODP.NET检索CLOB数据。 我的问题是reader.GetValue(i).ToString()最多只返回4000个字符,其余数据被截断。 如果我使用reader.GetOracleClob(1).Value我得到“Specified cast is not valid”错误。

知道我错过了什么吗?我正在使用ODP.NET 4.0

以下是我的代码。

using (OracleConnection oConn = new OracleConnection())
{
  oConn.ConnectionString = pConnstr;
  oConn.Open();
  using (OracleCommand oCmd = new OracleCommand("select varchar_column, clob_column from test", oConn))
  {
    oCmd.InitialLOBFetchSize = -1;
    string key, value, value1;
    var rd = oCmd.ExecuteReader();
    while (rd.Read())
    {
      if (rd.IsDBNull(1)) { value = ""; }
      else
      {
        key = rd.GetValue(0).ToString();
        value = rd.GetValue(1).ToString(); // unable to get more than 4000.
        value1 = rd.GetOracleClob(1).Value; // Specified cast is not valid.
      }
    }
  }
}

我在Oracle Doc中发现,当InitialLOBFetchSize属性设置为非零值时,将禁用GetOracleBlob,GetOracleClob,GetOracleBlobForUpdate和GetOracleClobForUpdate类型的访问器方法。这可能有助于解释为什么我“指定演员表无效”错误。

但是,我仍然无法获得超出4000限制的数据。

我尝试过这里记录的不同组合 http://docs.oracle.com/cd/E11882_01/win.112/e18754/featData.htm#autoId6 但没有运气。

2 个答案:

答案 0 :(得分:1)

实际上代码正常工作并获取它应该获得的数据。我只是没有意识到我的数据不完整,并且在第一眼看上去似乎是一个检索问题。遗憾。

以下是好的代码。

using (OracleConnection oConn = new OracleConnection())
{
  oConn.ConnectionString = pConnstr;
  oConn.Open();
  using (OracleCommand oCmd = new OracleCommand("select varchar_column, clob_column from test", oConn))
  {
    oCmd.InitialLOBFetchSize = -1;
    string key, value;
    var rd = oCmd.ExecuteReader();
    while (rd.Read())
    {
      if (rd.IsDBNull(1)) { value = ""; }
      else
      {
        key = rd.GetValue(0).ToString();
        value = rd.GetValue(1).ToString(); 
      }
    }
  }
}

答案 1 :(得分:0)

上述解决方案不适用于我。原来我的数据不是CLOB或BLOB而是LONG数据!因此,解决方法就是设置:

oCmd.InitialLONGFetchSize= -1;

代替

oCmd.InitialLOBFetchSize = -1;

如果此方法也对您有用,请发表评论。