代码之家  ›  专栏  ›  技术社区  ›  user1298925

为什么我在这个CLOB字段的GetOrdinal函数中得到OutOfRange异常?

  •  2
  • user1298925  · 技术社区  · 12 年前

    这是我的代码示例。字段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字段几个小时了。这是我最接近的一次。非常感谢您的帮助。

    p.s.可能是我的SELECT语句有问题吗?我一直在从不同的参考文献中获取代码。

    2 回复  |  直到 12 年前
        1
  •  3
  •   user1298925    12 年前

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

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

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

        2
  •  0
  •   codingbiz    12 年前

    试试这个

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

    现在,您的查询没有名称,因为您已将函数应用于名称,因此需要对其进行ALIAS以赋予其名称。例如 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");