web-dev-qa-db-ja.com

「System.Decimal」値に設定できませんでした。このプロパティを 'System.Double'型のnull以外の値に設定する必要があります

こんにちは、mvcの例を使用してデータベースからデータを取得しています。ここでエラーが発生しました

例外の詳細:System.InvalidOperationException: 'Employee'の 'number'プロパティを 'System.Decimal'値に設定できませんでした。このプロパティを 'System.Double'タイプのnull以外の値に設定する必要があります。

説明:現在のWeb要求の実行中に未処理の例外が発生しました。エラーの詳細とコードのどこで発生したかについては、スタックトレースを確認してください。

ここで私のコードを参照してください、私は上記のエラーを取得しました。

public ActionResult Details(int id)
{
    EmployeeContext empcon = new EmployeeContext();
    Employee employ = empcon.employees.Single(emp => emp.empid == id);
    return View(employ);
}

Routiconfig

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    RouteTable.Routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "emp", action = "Details", 
                        id = UrlParameter.Optional }
        );
}
16
stpdevi

Null値変換の試行がdoubleに格納されたためであると思われます。

doubleを変更します

double?

説明については、以下のリンクを参照してください。 http://msdn.Microsoft.com/en-us/library/2cf62fcy.aspx

ありがとう!

11
Hatjhie

それはDBからの問題かもしれません、私の経験から、私はストアプロシージャからのデータを使用するため、この例外を取得しました(エンティティフレームワークを使用してオブジェクトクラスを生成します)

my SPの1つの数値フィールド

CAST(NULL AS DECIMAL) AS UnitAmount

だから私のコードでは(エンティティフレームワークがクラ​​スを生成した後)

Decimal UnitAmount{get;set;}

しかし、コードを実行すると、このエラーが発生します

...「System.Int32」値に設定できませんでした。このプロパティを 'System.Decimal'タイプのnull以外の値に設定する必要があります。

これは、my SPに、このような結果を返すケース条件が1つあるため、データ型の戻り値が一致しないためです。

-- if no data
Select ... ,
       0  as UnitAmount, 
       ....

結果0をキャスト/変換しないと、Int32として表示されます(0.00-> Decimalとして表示)

8
user3682728

使用する

public decimal number { get; set; } 

または

public double number { get; set; }

リンク

5
Nagaraj S

私の場合、問題は間違ったDB列タイプにありました。これは数値であり、プロパティはlongでした。したがって、列をbigintとして再作成する必要がありました。

2
Jan Matousek

私の場合、それはビューに問題があり、null値があるときに値を返していました。

「ISNULL(dbo.STOCK_ITEMS.STDCOST、0)AS STDCOST」のようなものがありました

その後、動作しませんでした。

「ISNULL(dbo.STOCK_ITEMS.STDCOST、0.0)AS STDCOST」を試しました

うまくいきませんでしたが、以下はうまくいきました...

ISNULL(dbo.STOCK_ITEMS.STDCOST, 0.00) AS STDCOST

すべての作業が完了しました。..

1
ShaunOReilly

私の場合、コードをフロートから変更しましたか?倍に? & できます。

 public double? number { get; set; }

データベーステーブルの列タイプはfloatです。

0
Sushil Jadhav

テーブル内の列のタイプ(大きなプロジェクト、多くの依存関係)を変更できない状況にありました。

これに似たクラス定義にデータを供給するビューがありました:

    SELECT Name,Phone,ID FROM People

ここで、私のIDはint型でしたが、タイプ文字列として使用されていました。これを解決するために、代わりに次のようにビューを作成しました。

    SELECT Name, Phone, CONVERT(NVARCHAR(2), ID) AS ContactMethodTypeId FROM People

そのCONVERTを問題のある型の周りに入れると、指定された型として返されます。私の場合、NVARCHAR。

0
SauerTrout

「10進」値に設定できませんでした。このプロパティを「Int32」型のnull以外の値に設定する必要があります。 1つの列に対して。そして、私はwholdソリューションを検索し、この列をソリューションのIntとして設定していることがわかりました。しかし、データベースでは、intではなくお金として設定されていました。データベースレベルで変更しました。そしてそれは動作します。

0
Penny

SQLの10進数は、.Netの10進数とは異なります。 SqlDbType列挙の表を見ると、SQL 10進数はdouble型と同等であることがわかります。

From C#References

フロート->ダブル。 -1.79E +308〜1.79E +308の範囲内の浮動小数点数。

public double? number { get; set; }
0
habib