0

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

知道我错过了什么吗?我正在使用 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 但没有运气。

4

2 回答 2

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(); 
      }
    }
  }
}
于 2013-08-13T22:22:37.600 回答
0

上述解决方案对我不起作用。原来我的数据不是 CLOB 或 BLOB 而是 LONG Data!所以修复只是设置:

oCmd.InitialLONGFetchSize= -1;

代替

oCmd.InitialLOBFetchSize = -1;

如果此方法也适用于您,请发表评论。

于 2019-02-27T14:19:53.903 回答