我正在尝试通过ODP.NET检索CLOB数据。我的问题是那个读者。GetValue(i).ToString()最多只能返回4000个字符,其余数据将被截断。如果我使用阅读器。GetOracleClob(1)。我得到的值"指定的强制转换无效"错误。
知道我错过了什么吗?我使用的是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文档中发现,当InitialLOBFetchSize属性设置为非零值时,GetOracleBlob、GetOracleClob、GetOracleBlobForUpdate和GetOracleClobForUpdate类型的访问器方法将被禁用。这可能有助于解释为什么我得到"指定的强制转换无效"错误。
然而,我仍然无法获得超过4000限制的数据。
我尝试过这里记录的不同组合http://docs.oracle.com/cd/E11882_01/win.112/e18754/featData.htm#autoId6但运气不好。
实际上,代码工作正常,并获得了它应该获得的数据。我只是没有意识到我的数据是不完整的,乍一看似乎是一个检索问题。很抱歉
以下是好的代码。
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();
}
}
}
}
上面的解决方案对我不起作用。原来我的数据不是CLOB或BLOB,而是LONG数据!所以修复只是设置:
oCmd.InitialLONGFetchSize= -1;
代替
oCmd.InitialLOBFetchSize = -1;
如果这种方法也适用于你,请留下评论。