none
ODBC経由でMoney型を取得すると「入力文字列の形式が正しくありません。」とエラーが発生する RRS feed

  • 質問

  • ODBC経由でデータを取得するソフトをC#, Freamework3.5をベースに開発しています。

    お客様の環境で、通常のデータは正常に取得できているのですが、Money型を取得すると「入力文字列の形式が正しくありません。」とエラーが発生しています。

    Serverバージョン:SQL Server 2008R2

    ODBCドライバ:MDACのSQL Server(6.01.7601.17514)

    以下のことを試しました。

    ・社内で同じ環境(Server,ODBCドライバ,Frameworkバージョン)を構築し試したところエラーは発生しなかった。

    ・SQL文でstr("カラム名")を付加すると問題なく取得できた。

    StackTrace:

    System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)

    System.Number.ParseDecimal(String value, NumberStyles options, NumberFormatInfo numfmt)

    System.DataOdbc.OdbcDataReader.internalGetDecimal(Int32 i)

    System.DataOdbc.OdbcDataReader.GetValue(Int32 i, TypeMap typemap)

    System.DataOdbc.OdbcDataReader.GetValue(Int32 i)

    エラー内容からすると、取得したデータがおかしいのだとは思いますが、Money型として格納されているものがParseDecimalでエラーになることがあるのでしょうか。

    問題点、もしくは何かヒントになりそうな点などありましたらアドバイスをお願いします。

    2013年10月3日 1:56

回答

  • 要はDecimalに変換できないわけですから、その変換元の値が知りたいのです。その値に、カンマや¥が入っていたりしないでしょうか?もし入っているのでしたら、動かないコンピュータの何かカルチャーの影響かもしれません。

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク 星 睦美 2013年10月22日 1:48
    2013年10月8日 4:37
  • 長く間が空いてしまいましたが、本件、解決しました。
    原因はODBCの設定によるものでした。
    「出力時の通貨、数値、日付、時刻の形式にはシステムの地域設定を使用する」のチェックがオンの場合
    今回の現象が発生するようです。

    回答してくださったtrapemiyaさん、ありがとうございました。
    • 回答としてマーク apis1231 2013年10月24日 1:02
    2013年10月24日 1:01

すべての返信

  • ODBCを利用して、どのようにデータを取得されているのでしょうか? また、エラーが発生した時、実際、どのような値が取得されているのでしょうか? 通常は考えにくいですが、小数点がカンマになっているなどないでしょうか?

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2013年10月7日 2:14
  • trapemiyaさん

    返信ありがとうございます。
    簡単なコードを書くと以下のような感じです。

    // コネクションとコマンド、リーダーの生成は省略します
    // OdbcDataReader Readerとなります。
    --------------------------
    // データの格納配列
    List<object> Data = new List<object>();

    Reader.Read();
    for(int i ; i < Reader.FieldCount ; i++)
    {
      Data.add(Reader[i]);
    }
    --------------------------

    エラーとなっている個所は、Data.add(Reader[i])の部分です。
    また、データも件数の少ないテストデータなのですが、おかしい個所はありませんでした。

    2013年10月8日 4:12
  • 要はDecimalに変換できないわけですから、その変換元の値が知りたいのです。その値に、カンマや¥が入っていたりしないでしょうか?もし入っているのでしたら、動かないコンピュータの何かカルチャーの影響かもしれません。

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク 星 睦美 2013年10月22日 1:48
    2013年10月8日 4:37
  • trapemiyaさん
    返答ありがとうございます。
    変換元の値は、Frameworkの内部でエラーとなっているため分かりません。
    DBに入っている値は、エクスポート機能を利用してテキストファイルに出力したのですが
    それには、カンマや¥は入っていませんでした。

    たしかにカルチャーの影響でエラーが発生している可能性はありますね。
    確認をしてみます。

    ありがとうございました。
    2013年10月8日 6:24
  • Frameworkの内部というのは具体的には何でしょうか? OdbcDataReaderであれば取得した値がわかりますので、OdbcDataReader ではないということですよね? Decimalで受け取ろうとしてエラーになっているわけですから、一旦stringやobjectで受け取れば、調査できるかもしれません。

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2013年10月8日 6:57
  • trapemiyaさん
    返答ありがとうございます。

    初めにStackTraceを載せていますが
    OdbcDataReader.GetValueでは、内部的にDBの型を判別して変換処理を行っているようです。
    Money型の場合、Decimal型と判別されParseDecimalが実行されており、そこでエラーになっています。

    ですので、データを受け取る前にエラーとなっているためどのような値を変換しようとしているかは分からないです。
    ご指摘の通り、GetString()で取得した場合、その型判別してからの変換処理が行われないためエラーにならない可能性が高いです。
    その方法で、Framework内部で取得している値を確認してみます。


    2013年10月8日 7:58
  • 客先でGetString()で取得したところ、数値の前に¥マークが入っていました。
    「¥12,345」の形式で出力されていました。

    社内で用意したエラーとならない環境でGetString()で取得しましたが\マークは付きませんでした。
    その原因を今調査中です。
    Accessでは表示形式を設定できるという記述を見かけましたが、SQL Serverでも何か設定を行うことができるのでしょうか。
    何かヒントになりそうなアドバイスなどありましたらお願いします。
    2013年10月15日 6:16
  • 長く間が空いてしまいましたが、本件、解決しました。
    原因はODBCの設定によるものでした。
    「出力時の通貨、数値、日付、時刻の形式にはシステムの地域設定を使用する」のチェックがオンの場合
    今回の現象が発生するようです。

    回答してくださったtrapemiyaさん、ありがとうございました。
    • 回答としてマーク apis1231 2013年10月24日 1:02
    2013年10月24日 1:01