2010-02-26 14 views
8

Mi campo de base de datos (sql server 2005) se define con numérico (15,2).Lugares decimales que no se redondean correctamente: ¿se trata de un error LINQ to SQL?

El LINQ 2 SQL propiedad generado es

[Column(Storage="_My_Property_Name", DbType="Decimal(15,2)", UpdateCheck=UpdateCheck.Never)] 
    public System.Nullable<decimal> My_Property_Name 
    { 
     get 
     { 
      return this._My_Property_Name; 
     } 
     set 
     { 
      if ((this._My_Property_Name != value)) 
      { 
       this.OnMy_Property_NameChanging(value); 
       this.SendPropertyChanging(); 
       this._My_Property_Name = value; 
       this.SendPropertyChanged("My_Property_Name"); 
       this.OnMy_Property_NameChanged(); 
      } 
     } 
    } 

En depuración puedo comprobar el valor de la entidad para esta propiedad = 23.6363636363 (etc)

I a continuación, pasar por encima de context.SubmitChanges()

Tengo SQL Profiler en ejecución y esta es la declaración de actualización.

exec sp_executesql N' 
UPDATE [Staging].[My_Table_Name] 
    SET [LAST_UPDATE_DATE] = @p2, [Field1] = @p3, [Field2] = @p4, [Field3] = @p5, [Field4] = @p6, [Field5] = @p7, [Field6] = @p8, [Field7] = @p9 
WHERE ([Id] = @p0) AND ([RecordVersion] = @p1) 

SELECT [t1].[RecordVersion] FROM [Staging].[My_Table_Name] AS [t1] 
WHERE ((@@ROWCOUNT) > 0) AND ([t1].[Id] = @p10)',N'@p0 int,@p1 timestamp,@p2 datetime,@p3 decimal(21,8),@p4 decimal(21,8),@p5 decimal(21,8),@p6 decimal(21,8), @p7 decimal(21,8),@p8 decimal(21,8),@p9 decimal(15,2),@p10 int',@p0=2935,@p1=0x0000000000323018,@p2='2010-02-26 16:49:21:690', @p3=99.99992307,@p4=99.99992307,@p5=99.99992307,@p6=99.99992307,@p7=99.99992307,@p8=99.99992307, 
@p9=23.63,@p10=2935 

Como puede ver @ p9 = 23.63, yo esperaría que fuera 23.64.

actualización

Mi pregunta es,

Si se trata de un error de LINQ to SQL que sería de esperar que sea un conocido, donde iba a averiguarlo; ¿Hay alguna lista de errores mantenidos en algún lugar?

También ¿cuál sería el mejor trabajo?

  • supongo cambiar el campo a 15,3 no corregir el error, sería simplemente desplazarlo 1 decimal.
  • Reemplazar el OnMy_Property_NameChanged() funcionaría para esta propiedad, pero tengo muchos de ellos.

Actualización 2

esto no funcionaba bien, entra en este pedazo de código antes de SubmitChanges y parece funcionar, pero la actualización SQL generado todavía tiene el valor truncado, no se actualizó esta redondeado valor.

partial void OnMy_Property_Name_ChangingChanging(decimal? value) 
{ 
    if (!value.HasValue) 
    { 
     return; 
    } 
    value = 
     Math.Round(value.Value, 2, MidpointRounding.AwayFromZero); 
} 

La solución que tengo en este momento es simplemente actualizar el valor de la entidad directamente.

Respuesta

1

MSDN dice:

decimales y dinero Tipos El defecto precisión de tipo DECIMAL de SQL Server (18 dígitos decimales a la izquierda y derecha del punto decimal) es mucho menor que la precisión de CLR Tipo decimal con el que está emparejado por predeterminado. Esto puede provocar la pérdida de precisión al guardar datos en la base de datos . Sin embargo, puede ocurrir exactamente lo contrario si el tipo SQL Server DECIMAL está configurado con más de 29 dígitos de precisión. Cuando un tipo SQL Server DECIMAL ha sido configurado con una mayor precisión que el sistema CLR.La pérdida decimal, precisión puede ocurrir al recuperar los datos de la base de datos.

Puede manejar esto anulando OnMy_Property_NameChanged() y redondeando allí. Asegúrese de especificar el modo de redondeo correcto (a par o desde cero).

+0

si actualizo la base de datos directamente con 23.63636363636363 entonces se convierte en 23.64 .... que está bien. si anulo la propiedad, se arreglaría esta propiedad, pero es una gran base de datos con un montón de 15,2 campos definidos ... Realmente no quiero hacer eso para todos. ¿Pensaría que si esto es un error de Linq 2 Sql se habría encontrado antes? (gracias por la respuesta) –

+0

Sugiero profundizar en el interior de linq2sql utilizando un reflector si se siente seguro al respecto. Obviamente es algo sobre el generador de consultas. –

0

parece el error de LINQ. necesita cambiar DBType de Decimal(15,2) a Decimal(15,3). Eso es un incremento de 1 precisión adicional a la precisión de su columna en la base de datos.

+0

Pero luego esa columna se creará como (15,3) en caso de que usemos la creación automática de la base de datos. –

1

A mi me parece como si Enlace a SQL es truncar el valor a 2 decimales en lugar de redondeo ella.