我正在尝试通过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 但没有运气。
答案 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;
如果此方法也对您有用,请发表评论。