web-dev-qa-db-fra.com

n'a pas pu être défini sur une valeur 'System.Decimal'. Vous devez définir cette propriété sur une valeur non nulle de type 'System.Double'

Salut, j'utilise par exemple MVC pour obtenir des données à partir d'une base de données. Ici j'ai une erreur

Détails des exceptions: System.InvalidOperationException: le 'numéro' propriété sur 'Employé' n'a pas pu être définie sur une valeur 'System.Decimal' . Vous devez définir cette propriété sur une valeur non nulle de type 'System.Double'.

Description: une exception non gérée s'est produite lors de l'exécution de la demande Web en cours. Veuillez vérifier la trace de la pile pour plus d'informations informations sur l'erreur et son origine dans le code.

S'il vous plaît voir mon code ici, j'ai eu l'erreur ci-dessus.

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 }
        );
}
15
stpdevi

Je pense que cela pourrait être dû à la tentative de conversion de valeur nulle d'être stocké en double. 

Changez votre double en 

double?

Pour plus d'explications, veuillez consulter le lien ci-dessous: http://msdn.Microsoft.com/en-us/library/2cf62fcy.aspx

Merci!

10
Hatjhie

C'est peut-être le problème de la base de données. D'après mon expérience, j'ai eu cette exception parce que j'utilise les données de la procédure store (générer une classe d'objet à l'aide d'une structure d'entité).

ce champ numéro dans mon SP I fournissant un contrat de données comme celui-ci

CAST(NULL AS DECIMAL) AS UnitAmount

donc dans mon code (après que l'entité framework génère une classe), j'ai eu une classe qui contient 

Decimal UnitAmount{get;set;}

mais quand je lance mon code cette erreur se produit

... n'a pas pu être défini sur une valeur 'System.Int32'. Vous devez définir cette propriété à une valeur non nulle du type 'System.Decimal'.

c'est parce que dans mon SP, il y a une condition de cas pour laquelle je retourne mon résultat comme ceci, de sorte que le type de données renvoyé est incompatible.

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

Si vous ne convertissez pas/ne convertissez pas le résultat 0 -> il sera vu comme Int32 (0.00-> vu comme décimal,)

7
user3682728

Utilisation

public decimal number { get; set; } 

ou

public double number { get; set; }

lien

5
Nagaraj S

Dans mon cas, il y avait un problème avec la vue, renvoyant une valeur quand il y avait une valeur nulle.

Avait quelque chose comme "ISNULL (dbo.STOCK_ITEMS.STDCOST, 0) AS STDCOST"

Alors n'a pas fonctionné.

Essayé "ISNULL (dbo.STOCK_ITEMS.STDCOST, 0.0) COMME STDCOST"

N'a pas travaillé aussi, mais ce qui suit a fonctionné ...

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

Tous travaillent maintenant ....

1
ShaunOReilly

Dans mon cas, le problème était dans le type de colonne de base de données incorrect - qui était numérique et la propriété était long . Il me suffisait donc de recréer la colonne sous la forme bigint .

1
Jan Matousek

Dans mon cas, le code a changé de float? doubler? & Ça marche. 

 public double? number { get; set; }

mon type de colonne de table de base de données est float.

0
J Sushil

J'étais dans une situation où je ne pouvais pas changer le type de la colonne dans la table (grand projet, beaucoup de dépendances).

J'avais une vue qui introduisait des données dans une définition de classe, semblable à ceci:

    SELECT Name,Phone,ID FROM People

Ici, mon identifiant était de type int, mais était consommé en tant que chaîne de type. Pour résoudre ce problème, j'ai plutôt construit ma vue comme ceci:

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

Il suffit de tuck que CONVERTIR autour du type problématique et il retournera en tant que type spécifié. Dans mon cas, NVARCHAR.

0
SauerTrout

J'ai rencontré des questions similaires, en disant "ne pouvait pas être défini sur une valeur 'Decimal'. Vous devez définir cette propriété sur une valeur non nulle de type 'Int32'". pour une colonne. et je cherche la solution complète, trouve que je règle cette colonne comme Int dans la solution. Mais dans la base de données, il a été défini comme de l'argent, au lieu de int. donc je l'ai changé au niveau de la base de données. et il fonctionne.

0
Penny

Une décimale en SQL n'est pas la même chose qu'une décimale en .Net. Si vous regardez la table de l'énumération SqlDbType, vous constaterez que le nombre décimal SQL équivaut à un type double. 

De Références C #

Flotteur-> Double. Nombre en virgule flottante compris entre -1,79E +308 et 1.79E +308.

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