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 に答える