为什么我在此CLOB字段的GetOrdinal函数中获得OutOfRangeexception?

这是我的代码示例。 字段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")语句时,我得到一个超出范围的exception。 不明白为什么? 我一直在努力阅读这个CLOB字段几个小时。 这是我最接近的。 非常感谢您的帮助。

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

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

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

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

试试这个

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

现在你的查询没有名字,因为你已经将一个函数应用于名称所以你需要ALIAS它给它一个名字,例如AS FUNCTION_SCRIPT

UPDATE

 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");