none
AccessDBの関数利用(MAX値Get)について C# RRS feed

  • 質問

  • AccessDBを C#で利用しています

    SQL文で Max()関数を利用したとき 値の取り込みでエラーが表示されます

    関数利用時には、どのようにするのでしょうか 御教授下さい

          string strSql = "Select Max(xxNO) From xxTable Where ..."

                com = new System.Data.OleDb.OleDbCommand(strSql, cn);
                dRead = com.ExecuteReader();
                if (dRead.Read())
                {
                    if (dRead.IsDBNull(0))
                        rtn = 0;  // CategoryNo = null
                    else
                        rtn = dRead.GetByte(0);  //////// ここで<キャストできない>エラーとなる 
            以下省略

    Max()がつかない読み込みの場合GetByte(0);  で読み込めます

    暑さでボケているのは私だけでしょうか  よろしくお願いいたします

     

    2010年8月29日 7:55

回答

  • Max関数の戻り値が整数型(私の環境でint32)になるためにキャストできずに失敗するようです。以下などのようにして、値を取得した後にbyte型に変換すればうまくいきます。
    rtn = byte.Parse(dRead[0].ToString());

    ちなみにCByte(Max(xxNO))としてみましたが、私の環境でdRead[0]の型はint16で戻ってきたため、やはりキャストに失敗しました。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク BestOsaka 2010年8月30日 2:50
    2010年8月29日 17:58
    モデレータ

すべての返信

  • 列 xxNO の型は byte なんでしょうか?

    DbDataReader には GetInt32 や GetInt64 など、いろんな型で取得するメソッドがあるので、xxNO 列の型にあったものを呼び出す必要があります。

     


    なかむら(http://d.hatena.ne.jp/griefworker)
    2010年8月29日 8:32
  • Max関数の戻り値が整数型(私の環境でint32)になるためにキャストできずに失敗するようです。以下などのようにして、値を取得した後にbyte型に変換すればうまくいきます。
    rtn = byte.Parse(dRead[0].ToString());

    ちなみにCByte(Max(xxNO))としてみましたが、私の環境でdRead[0]の型はint16で戻ってきたため、やはりキャストに失敗しました。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク BestOsaka 2010年8月30日 2:50
    2010年8月29日 17:58
    モデレータ
  • ありがとうございます

    rtn = byte.Parse(dRead[0].ToString());

    で うまくいきました

    数学系関数の場合int16で戻るんですかね

    以後同様のケースの場合戻り値をチェックしてみます

    戻り値が別のデータ型で戻るということは 私には浮かびませんでした

    どうも暑さだけのセイではなさそうです お世話になりました

     

    2010年8月30日 2:49
  • いくらなんでも文字列を経由するのはちょっと。Access 2010で試してみましたが、MAX()はInt32を返すようです。

    (byte)(int)dRead[0]

    になるかな。

    2010年8月30日 4:01
  • アドバイスありがとうございます

    戻り値は環境によって変化することなどはないでしょうか

    32 64 ビットで違いがあるとか Accessのバージョンとか

    文字列を使うのはそのへんのカバーもできそうに感じました。。。

    変化することなどはないだろうとは思っていますが

    また 情報があれば教えてください ありがとうございました

    2010年8月30日 9:24