2010-01-06 15 views
6

Je suis en train de charger un fichier en utilisant FileHelpers (comme déjà il à l'exception de ce seul problème: P) Je dois enregistrer des données de fichier CSV dans la base de données, en utilisant un type de données SqlDecimal pour stocker les valeurs décimales des fichiers CSV. Tout cela fonctionne très bien, jusqu'à ce que j'ai une valeur vide pour le FixRate1. Ceci est signalé par une erreur.comment gérer des valeurs nulles pour le type de données SQLDecimal dans les classes FileHelper

« Avertir Exception: Null valeur trouvée pour le champ « Taux » dans la classe « SWTrade » Vous devez spécifier un FieldNullValueAttribute parce que ce est un ValueType et ne peux pas être nulle. ».

J'ai essayé de mettre [FileHelpers.FieldNullValue (SqlDecimal.Null)] mais il y a évidemment une erreur.

un argument d'attribut doit être un expression constante, typeof expression ou matrice expression création d'un type de paramètre d'attribut

Même si je remplacer la méthode FieldToString dans le SqlDecimalConverter classe , la fonction n'est pas appelée, lors de la lecture des données. Eh bien, ceci étant le cas, y a-t-il un moyen d'assigner une valeur nulle ou même une autre valeur codée en dur aux données Rate, que je peux ensuite remplacer par une direction nulle dans ma propre logique?

S'il vous plaît laissez-moi savoir si vous auriez besoin de plus de détails. Merci d'avance.

Répondre

2

Je ne l'ai jamais travaillé avec FileHelpers, mais vous pouvez essayer à la place:

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

En plus de vos autres attributs, bien sûr.

Notez le grand changement ici - J'ai ajouté un point d'interrogation à SqlDecimal pour en faire un nullable type.

Ensuite, vous pouvez utiliser Rate.HasValue à se que ce soit nul ou non et Rate.Value pour accéder au SqlDecimal si HasValue est vrai.

Quelque chose comme ça bien utiliser SqlDecimal.Null après avoir analyser le fichier:

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

Edition - Il est possible que si vous faites taux annulable (SqlDecimal?) vous ne même pas besoin de l'attribut « FieldNullValue ». Encore une fois, je ne connais pas la bibliothèque. :(

+0

Non, il a mentionné qu'il a essayé SqlDecimal.Null qui n'est pas une expression constante. – Sapph

+0

@Sapph: désolé, mon mauvais - je n'ai pas lu la question (et votre réponse) avec suffisamment d'attention. –

3

Vous pouvez essayer d'utiliser un type Nullable Si vous utilisez un type Nullable, vous n'avez pas besoin de spécifier l'attribut FieldNullValue.Cette approche fonctionne correctement avec DateTime utilisant le convertisseur de type intégré FileHelpers.

Si cela ne fonctionne pas, vous pouvez affecter une valeur par défaut que vous pouvez traiter comme nulle. Mais cela peut être problématique s'il y a une valeur réelle qui correspond à la valeur par défaut choisie:

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

Mise à jour

Je viens de faire un test et en utilisant simplement une décimale? le type fonctionne bien. Ensuite, vous pouvez le convertir dans votre code à la bonne SqlType pour accéder à la base de données. Je pense que c'est l'approche la plus simple.

Ainsi, le champ serait tout simplement ressembler à:

public decimal? Rate; 

pas d'attributs requis.

+0

[FieldNullValue (typeof (SqlDecimal), "01/01/0001")] Ne pensez-vous pas qu'il générerait une erreur en lui-même en essayant de convertir une valeur datetime possible en un type SQLDecimal? – keepsmilinyaar

+0

Oups. :) Merci - c'est un reste d'un test DateTime. Changé à -1. –

+0

{"Cast non valide de 'System.String' à 'System.Data.SqlTypes.SqlDecimal'."} est ce que je reçois lorsque je mets dans la ligne mentionnée par vous. [FieldNullValue (typeof (SqlDecimal), "-1")] D'autres idées ??? – keepsmilinyaar

0

Pourquoi ne pouvez-vous utiliser Decimal ou un .net approprié au lieu de SqlDecimal type de données?
Je suggère que vous devriez changer le code à public Decimal? Rate; à la place.

+0

Je ne sais pas très bien comment fonctionne FileHelpers. Va probablement devoir essayer et jeter un oeil sur le code source. Je veux réellement convertir l'ensemble du fichier csv en un datatable afin que je puisse SQLBulkCopy pour persister les données. Mais je reçois l'erreur suivante, lors de l'utilisation des types nullables « DataSet ne supporte pas System.Nullable <> » En outre, lors de l'appel « fileHelperEngine.ReadFileAsDT() » n'est pas déclenché la méthode de remplacement FieldToString(). – keepsmilinyaar

7

Les autres commentaires sont juste u besoin d'utiliser

private decimal? internalRate; 

Et plus tard créer une propriété pour la conversion, en fait la bibliothèque autoconverts que les types natifs et SqlDecimal est pas.

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

PS: Si tu veux aller le chemin de conversion personnalisé, l'utiliser pour lire u besoin de remplacer la méthode StringToField (FieldToString est appelé pour l'écriture)

Hope this helps :)

+0

De manière surprenante, la fonction FieldToString n'est pas appelée et l'assistant de fichier lève directement une exception. – keepsmilinyaar

+0

U retournons une valeur SqlDecimal? Pouvez-vous m'envoyer le code du convertisseur ou le coller ici pour vérifier quel est le problème? Merci – MarcosMeli