6

私はこのエラーの回避策を見つけましたが、なぜこれが発生するのかについて本当に興味があり、他の誰かがこのエラーを持っているかどうか疑問に思っていました。

私の機能は次のとおりです。

public void Blog_GetRating(int blogID, ref decimal rating, ref int voteCount)
{
    // Sql statements
    // Sql commands

    if (DataReader.Read())
    {
        // this line throws a 'Input string was not in a correct format.' error.
        rating = decimal.Parse(DataReader["Rating"].ToString());

        // this works absolutly fine?!
        decimal _rating = 0;
        decimal.TryParse(DataReader["Rating"].ToString(), out _rating);

        rating = _rating;
    }
}

誰もがそれを見たことがありますか?

さらに奇妙なのは、これを入力した場合です。

rating = decimal.Parse("4.0");

これは正常に機能します。4.0は私のDataReaderから出てくるものです。

前に言ったように、TryParseメソッドは正常に機能するので、持ち運びを妨げることはありませんが、誰かがそれに対する答えを持っているかどうかを確認することに本当に興味があります。

返信をお待ちしております!

ショーン

編集-解決済み

decimal.Parseメソッドは正常に機能し、関数が2回目に実行されたとき(ループ内にあったとき)、投稿は評価されなかったため、データリーダーからnull値が返されていました。COALESCEをSQLで計算にラップすると、問題はうまく解決しました。したがって、あなたが言ったように、なぜ、tryparseメソッドは例外をスローせず、デフォルトの0を_ratingに維持するだけでした。

4

5 に答える 5

11

それは私にはまったく奇妙に見えません。

Decimal.Parse()不正なフォーマットの例外をスローする ことになっています。Decimal.TryParse()その例外をスローしませんが、代わりにfalseを返します。キッカーは、からの戻り値をチェックしていないということですDecimal.TryParse()Decimal.TryParse()で例外を発生させるすべての入力に対してfalseを返し、それ以外の場合はtrueを返す 実際の良いオッズを示しますDecimal.Parse()。そして、Decimal.TryParse()falseを返す場合、出力引数は常に「0」です。

考えられる注意点の1つは、ローカリゼーションです。が一見正常に見える入力について不平を言っている場合Decimal.Parse()は、サーバーで使用されている数値形式(現在のカルチャ)が、係数を仮数から分離するために小数ではなくコンマを使用しているかどうかを確認できます。しかし、「4.0」テストが正常に機能したことを考えると、これが問題であるとは思えません。

最後に、データリーダーからこの変換を行うときは、データリーダーのソース列タイプを考慮する必要があります。すでに小数である可能性がある場合。なぜそれを文字列に変換して元に戻すだけなのですか?

于 2009-09-01T15:46:11.347 に答える
2

あなたはこれを言っています:

    // this works absolutly fine?!
    decimal _rating = 0;
    decimal.TryParse(DataReader["Rating"].ToString(), out _rating);

しかし、実際にはTryParseの戻り値を確認していません。使用しているオーバーロードを考えると、decimal.Parseとdecimal.TryParseは解析に同じ「ルール」を使用するため、TryParseは実際に失敗している(falseを返す)と思います。

どちらもあなたが思っているように機能していないのではないかと思います。両方とも失敗している可能性がありますが、TryParseはスローしません。

于 2009-09-01T15:49:43.197 に答える
1

SQLのdecimal列は、Decimalに変換できる文字列に解析されないため、tryparseはfalseを返します。次のようなものを試してください。

 if (Convert.IsDBNull(reader["DecimalColumn"]))
     {
        decimalData = 0m;
     }
     else
     {
        decimalData = reader.GetDecimal(reader.GetOrdinal("DecimalColumn"));
     }
于 2012-06-01T15:56:27.587 に答える
1

私は今日同じ問題に直面しています。これを試して:

rating = decimal.Parse("4,0");

同じエラーが発生します。


この背後にある理由は文化です。フランスの文化では、4.0は4,0として表されるため、例外がスローされます。

decimal.TryParse文化不変の方法であるため、問題なく機能します。

于 2014-09-26T16:33:00.563 に答える
0

TryParseをこれに変更して、再試行してください。

if (!decimal.TryParse(DataReader["Rating"].ToString(), out _rating))
{
  throw new Exception("Input string was not in a correct format");
}

私はこれが投げるに違いない...

于 2009-09-01T15:54:53.013 に答える