DOBON.NET DOBON.NETプログラミング掲示板過去ログ

OracleDataReaderを使った行取得

環境/言語:[C#]
分類:[.NET]

C#でOracleDataReaderを使ったレコードの取得をしようとしています。
下記のコードで、command.ExecuteReader()の次の行に
ブレークポイントを置いてデバッグすると、正常にレコードが取れますが、
ブレークポイントをおかずにデバッグすると、
「Invalid attempt to read when no data is present」
というExceptionメッセージが発生します。
これは、OracleDataReaderへのデータの読み込みが遅いために、
ExecuteReder()メソッドがちゃんとOracleDataReaderにデータを読み込む前に
次の処理に行こうとして、出ているエラーのような気がしています。
どなたか同じような現象をご存知の方はご教授ください。
よろしくお願いします。

↓↓↓以下、ソースです。−−−

private void setJiku()
{

  OracleCommand command = this.oracleConnection1.CreateCommand();
  OracleTransaction trans;

  this.oracleConnection1.Open();
  trans = this.oracleConnection1.BeginTransaction();
  command.Transaction = trans;

  string sJcd = "0";
System.Text.StringBuilder sql = new System.Text.StringBuilder();
System.Text.StringBuilder sql2 = new System.Text.StringBuilder();


  try
  {
sql.Append("SELECT JIKU_CD FROM ");
sql.Append(" (SELECT ROWNUM, JIKU_CD FROM ROMAP_JIKU_SET ");
sql.Append(" ORDER BY JIKU_CD DESC)");
sql.Append(" WHERE ROWNUM = 1 ");

    //最終レコードの取得

    command.CommandText = sql.ToString();
    OracleDataReader reader1 = command.ExecuteReader();

//↓ここでブレークするとうまくいくのですが、ブレークしないとエラーとなるのです
    sJcd = reader1.GetValue(0).ToString();

    //sJcdをインクリメントする
    if(( 0 < int.Parse(sJcd) )&&( int.Parse(sJcd) < 999 ))
    {
      int iJcd = int.Parse(sJcd) + 1;
      sJcd = iJcd.ToString().PadLeft(3,'0');
    }
    else
    {
      MessageBox.Show("これ以上のレコード追加はできません");
    }
    reader1.Close();

//レコード追加
sql2.Append("INSERT INTO ROMAP_JIKU_SET ");
sql2.Append("(JIKU_CD)");
sql2.Append(" VALUES( '" + sJcd + "')");
command.CommandText = sql.ToString();
command.ExecuteNonQuery();
trans.Commit();

  }
  catch(Exception e)
  {
trans.Rollback();
MessageBox.Show(e.Message);

  }
this.oracleConnection1.Close();

}
reader1.Read()しないといけません。


------------------------------------------------------
中博俊 MSMVP Visual Studio C# Since 2004/04-2006/03, MCP
http://naka.wankuma.com/
http://blogs.wankuma.com/naka/
naka@wankuma.com
中博俊 さん、
早々にアドバイスいただいていたのに、返信送れて申し訳ありません。

reader1.Read()するとなぜかいつもfalseが返ってきます。
Read()しなくてもreader1に結果が取れているときと、
取れていないときがあります。
ちなみに取得レコードは常に1レコードのみとなるようなクエリを
実行しています。

トランザクションをかけていることが何か原因しているということは
あるでしょうか?
単なる構文ミスでした。

while(reader1.Read() == true){
sCd = reader1.GetValue(0).ToString();
}

としたらちゃんと取れました。
大変お騒がせしました。
■No11636に返信(まだらねこさんの記事)
> 単なる構文ミスでした。
>
> while(reader1.Read() == true){
> sCd = reader1.GetValue(0).ToString();
> }
>
> としたらちゃんと取れました。
> 大変お騒がせしました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板