2010-01-06 16 views
6

Estoy intentando cargar un archivo usando FileHelpers (como ya, excepto por este problema: P) Tengo que guardar los datos del archivo CSV en la base de datos, y también utilizando un tipo de datos SqlDecimal para almacenar los valores decimales de los archivos CSV.cómo manejar valores nulos para el tipo de datos SQLDecimal en clases de FileHelper

[FileHelpers.FieldOptional()] 
[FileHelpers.FieldConverter(typeof(SqlDecimalConverter))] 
public SqlDecimal Rate; 

Todo esto funciona bien, hasta que tenga un valor en blanco para el FixRate1. Esto se marca con un error.

"Advertir Excepción: El valor nulo para encontrar el campo 'Rate' en la clase 'SWTrade' Debe especificar un FieldNullValueAttribute porque este es un ValueType y no puede ser nulo.".

He intentado poner [FileHelpers.FieldNullValue (SqlDecimal.Null)] pero obviamente arroja un error.

Un argumento atributo debe ser una expresión constante , typeof expresión o creación de la matriz de expresión de un parámetro de atributo de tipo

A pesar de que anulan los método FieldToString en la clase SqlDecimalConverter , la función no se llama, al leer los datos.

Bueno, siendo este el caso, ¿hay alguna manera de asignar cualquier valor nulo o incluso algún otro valor codificado a los datos de Frecuencia, que luego puedo reemplazar con una dirección nula en mi propia lógica?

Háganme saber si necesita más detalles. Gracias de antemano.

Respuesta

2

nunca he trabajado con FileHelpers, pero se puede tratar en su lugar:

[FileHelpers.FieldNullValue(null)] 
public SqlDecimal? Rate; 

Además de sus otros atributos, por supuesto.

Tenga en cuenta el gran cambio aquí - He añadido un signo de interrogación a SqlDecimal para que sea un nullable type.

continuación, puede utilizar Rate.HasValue a sí misma ya sea nula o no y Rate.Value para acceder a la SqlDecimal si HasValue es cierto.

Algo como esto va a usar adecuadamente SqlDecimal.Null después de analizar el archivo:

SqlDecimal trueRate = (Rate.HasValue ? Rate.Value : SqlDecimal.Null); 

Editar - Es posible que si se hace Tasa anulable (SqlDecimal?) que ni siquiera necesita el atributo "FieldNullValue". De nuevo, no estoy familiarizado con la biblioteca. :(

+0

No, mencionó que probó SqlDecimal.Null, que no es una expresión constante. – Sapph

+0

@Sapph: lo siento, es malo - No leí la pregunta (y su respuesta) con suficiente cuidado. –

3

Puede intentar con un tipo Nullable. Si está usando un tipo Nullable, entonces no necesita especificar el atributo FieldNullValue.

[FileHelpers.FieldConverter(typeof(SqlDecimalConverter))] 
public SqlDecimal? Rate; 

Ese enfoque funciona bien con DateTime usando el convertidor de tipos de FileHelpers incorporado.

Si eso no funciona, entonces podría asignar un valor predeterminado que podría tratar como nulo. Pero eso puede ser problemático si hay un valor real que corresponde al valor elegido:

[FieldNullValue(typeof(SqlDecimal), "-1")] 
[FileHelpers.FieldConverter(typeof(SqlDecimalConverter))] 
public SqlDecimal Rate; 

actualización

que acabo de hacer una prueba y el simple uso de un número decimal? tipo funciona bien Luego puede convertirlo en su código al SqlType adecuado para acceder a la base de datos. Creo que ese es el enfoque más fácil.

Así que el campo sólo se vería como:

public decimal? Rate; 

ningún atributo necesario.

+0

[FieldNullValue (typeof (SqlDecimal), "01/01/0001")] ¿No cree que generaría un error en sí mismo al intentar convertir un posible valor de fecha y hora a un tipo SQLDecimal? – keepsmilinyaar

+0

Vaya. :) Gracias - es un sobrante de una prueba DateTime. Cambiado a -1. –

+0

{"Transmisión no válida de 'System.String' a 'System.Data.SqlTypes.SqlDecimal'."} es lo que obtengo cuando coloco en la línea mencionada por usted. [FieldNullValue (typeof (SqlDecimal), "-1")] ¿Alguna otra idea ??? – keepsmilinyaar

0

¿Por qué no puede usar Decimal o un tipo de datos .net apropiado en lugar de SqlDecimal?
Estoy sugiriendo que debe cambiar el código a public Decimal? Rate; en su lugar.

+0

No estoy seguro de cómo funcionan los FileHelpers. Probablemente tengas que intentar echarle un vistazo al código fuente. De hecho, quiero convertir todo el archivo csv en una tabla de datos, así que puedo SQLBulkCopy para conservar los datos. pero me da el siguiente error, cuando se utilizan tipos anulables "conjunto de datos no soporta System.Nullable <>" Además, al llamar "fileHelperEngine.ReadFileAsDT()" del FieldToString método de reemplazo() no está activado. – keepsmilinyaar

7

Los otros comentarios tienen razón u necesidad de utilizar

private decimal? internalRate; 

Y más tarde crear una propiedad para la conversión, de hecho, la biblioteca sólo autoconverts tipos nativos y SqlDecimal no es uno.

public SqlDecimal? Rate 
{ 
    get 
    { 
     if (internalRate.HasValue) 
      return new SqlDecimal(internalRate.Value); 
     else 
      return null; 
    } 
} 

PD: Si quieres ir a la forma convertidor de costumbre, para usarlo para lectura u necesidad de reemplazar el método StringToField (FieldToString se llama para la escritura)

Espero que esto ayude :)

+0

Sorprendentemente, no se llama a la función FieldToString y el asistente de archivos arroja una excepción directamente. – keepsmilinyaar

+0

U están devolviendo un valor SqlDecimal? ¿Puede enviarme el código del convertidor o pegarlo aquí para verificar cuál es el problema? Gracias – MarcosMeli

Cuestiones relacionadas