2

这是我的代码示例。FUNCTION_SCRIPT 字段是我的表 IS_FUNCTION 中的一个 CLOB 字段(唯一的 CLOB 字段)

public void ReadFunction(string FName, out string fContent) {
    OracleCommand command = _connection.CreateCommand();
    OracleTransaction transaction = _connection.BeginTransaction();
    command.Transaction = transaction;
    command.CommandText = "SELECT TO_CLOB(TO_NCLOB(FUNCTION_SCRIPT)) FROM IS_FUNCTION where FNAME=:fName ";
    command.Parameters.Add("FName", OracleType.NVarChar).Value = FName;
    OracleDataReader odr = command.ExecuteReader();
    int temp = odr.GetOrdinal("FUNCTION_SCRIPT");
    OracleLob myLob = odr.GetOracleLob(temp);
    fContent = (String)myLob.Value;
    odr.close();
}

temp = odr.GetOrdinal("FUNCTION_SCRIPT")执行语句时出现超出范围的异常。不知道为什么?我已经尝试阅读这个 CLOB 字段几个小时了。这是我最近的一次。您的帮助将不胜感激。

ps 会不会是我的 SELECT 语句有问题?我一直在从不同的参考资料中获取代码。

4

2 回答 2

3

感谢所有的建议和帮助。我发现我的问题通过添加一个

 if(odr.Read())
            {
                int temp = odr.GetOrdinal("FUNCTION_SCRIPT");
                OracleLob myLob = odr.GetOracleLob(temp);
                fContent = (String)myLob.Value;
            }

换句话说,我在 ExecuteReader() 语句之后缺少语句 odr.Read 。

于 2012-09-25T19:25:44.980 回答
0

尝试这个

command.CommandText = "SELECT TO_CLOB(TO_NCLOB(FUNCTION_SCRIPT)) AS FUNCTION_SCRIPT FROM IS_FUNCTION where FNAME=:fName ";

现在您的查询没有名称,因为您已将函数应用于名称,因此您需要为其命名,例如AS FUNCTION_SCRIPT

更新

OracleDataReader odr = command.ExecuteReader();
if(odr.HasRows)
{
  int temp = odr.GetOrdinal("FUNCTION_SCRIPT");
  OracleLob myLob = odr.GetOracleLob(temp);
  fContent = (String)myLob.Value;
}
else
   throw new Exception("No rows returned from database");
于 2012-09-24T23:48:12.933 回答