2010-04-15 5 views
2

Je travaille sur une application vb.net qui importe à partir d'une feuille de calcul Excel.Préservation des valeurs NULL dans une double variable

If rdr.HasRows Then 
     Do While rdr.Read() 
      If rdr.GetValue(0).Equals(System.DBNull.Value) Then 
       Return Nothing 
      Else 
       Return rdr.GetValue(0) 
      End If 
     Loop 
    Else 

j'utilisais valeur de chaîne pour stocker les valeurs doubles et lors de la préparation de la déclaration de base de données j'utiliser ce code:

If (LastDayAverage = Nothing) Then 
      command.Parameters.AddWithValue("@WF_LAST_DAY_TAG", System.DBNull.Value) 
     Else 
      command.Parameters.AddWithValue("@WF_LAST_DAY_TAG", Convert.ToDecimal(LastDayAverage)) 
     End If 

J'ai maintenant des données avec quelques décimales et les données ont été mises dans la variable chaîne en notation scientifique, donc cela semble être la mauvaise approche. Cela n'a pas semblé juste en utilisant la variable de chaîne pour commencer.

Si j'utilise une variable de type double ou décimal, les valeurs excel vierges se présentent comme 0,0.

Comment conserver les valeurs vides?


Note: J'ai essayé

variable comme Nullabe (de Double)

Mais lors du passage de la valeur à l'insert SQL-je obtenir: "objet Nullable doit avoir une valeur."


Solution:

fixe en changeant le type de données du paramètre dans la sous mon appel, puis en utilisant Variable.HasValue faire l'insert DBNull conditionnelle.

+0

Y a-t-il des valeurs qui sont 0.0 qui ne devraient pas être nulle? – Barry

+0

Est-ce que ce champ dans la base de données autorise les valeurs NULL? – R0MANARMY

+0

Oui, il y a 0.0 et il y a des valeurs nulles. C'est le problème :) – Sam

Répondre

4

Je ne sais pas quelle API que vous utilisez pour effectuer des insertions de base de données, mais avec beaucoup d'entre eux, y compris ADO.NET, la bonne façon d'insérer des valeurs NULL est d'utiliser DBNull.Value. Donc, ma recommandation est que vous utilisez Nullable(Of Double) dans votre code VB, mais quand vient le temps de faire l'insertion, vous devez remplacer toutes les valeurs nulles par DBNull.Value.

0

Je signale un article HERE pendant que je continue à chercher comment acheive une solution à votre situation, mais l'article pourrait avoir une autre solution qui consiste à supprimer les valeurs nulles, et ajoutez une valeur par défaut. Si je trouve autre chose, je l'afficherai.

Lorsque vous configurez une base de données (au moins dans MS SQL Server), vous pouvez marquer un champ comme valeurs NULL et permettant qui les valeurs par défaut à prendre. Si vous regardez à travers les structures DB des personnes, vous verrez que beaucoup de gens autorisent les valeurs NULL dans leur base de données. C'est une très mauvaise idée. Je ne recommanderais jamais permettant des valeurs NULL sauf si le champ peut logiquement avoir une valeur NULL (et même si je trouve cela seulement vraiment se produit dans les champs DATE/TIME).

Les valeurs NULL entraînent plusieurs problèmes. Pour les démarreurs, les valeurs NULL ne sont pas identiques aux valeurs de données. Une valeur NULL correspond à des valeurs non définies . Sur la fin de ColdFusion, c'est pas terrible que les valeurs NULL viennent en tant que chaînes vides (pour le plus partie). Mais en SQL, NULL et vide chaîne sont très différents et agissent très différemment. Prenez les données suivantes tableau par exemple:

id name 
--------------- 
1  Ben 
2  Jim 
3  Simon 
4  <NULL> 
5  <NULL> 
6  Ye 
7 
8 
9  Dave 
10 

Ce tableau a quelques chaînes vides (id: 7, 8, 10) et certaines valeurs NULL (id: 4, 5).Pour voir comment ceux-ci se comportent différemment, regardez la requête où nous essayons de trouver le nombre de champs qui n'ont pas les valeurs suivantes:

Launch code in new window » Download code as text file » 

    * SELECT 
    * (
    * SELECT 
    * COUNT(*) 
    * FROM 
    * test t 
    * WHERE 
    * LEN(t.name) = 0 
    *) AS len_count, 
    * (
    * SELECT 
    * COUNT(*) 
    * FROM 
    * test t 
    * WHERE 
    * t.name IS NULL 
    *) AS null_count, 
    * (
    * SELECT 
    * COUNT(*) 
    * FROM 
    * test t 
    * WHERE 
    * t.name NOT LIKE '_%' 
    *) AS like_count, 
    * (
    * SELECT 
    * COUNT(*) 
    * FROM 
    * test t 
    * WHERE 
    * t.name IS NULL 
    * OR 
    * t.name NOT LIKE '_%' 
    *) AS combo_count 

This returns the following record: 

LEN Count: 3 
NULL Count: 2 
LIKE Count: 3 
Combo Count: 5 

Nous cherchions 5 sous forme d'enregistrements 4, 5, 7, 8 et 10 ne contiennent pas les valeurs . Toutefois, vous pouvez voir que une seule tentative a renvoyé 5. Cela est car, alors qu'une valeur nulle n'a pas avoir une longueur, ce n'est pas un type de données qui a du sens avec la longueur. Comment peut- rien avoir ou ne pas avoir une longueur? C'est comme demander "Qu'est-ce que cette équation mathématique sent?" Vous ne pouvez pas faire des comparaisons comme ça. Donc, en autorisant les valeurs NULL, vous travaillez très dur pour obtenir le type de données que vous recherchez. À partir d'un angle connexe , l'autorisation des valeurs NULL réduit vos condamnations concernant les données dans votre base de données. Vous ne pouvez jamais être sûr de savoir si une valeur existe ou pas. Est-ce que vous vous sentez en sécurité et si vous êtes à l'aise lors de la programmation?

En outre, tout en exécutant LEN() sur une valeur NULL n'agit pas comme vous le pensez , il ne pas non plus générer une erreur. Cela rendra débogage votre code encore plus difficile si vous ne comprenez pas la différence entre les valeurs NULL et les valeurs de données.

Ligne de fond: NE PERMETTEZ PAS DE VALEURS NULL à moins que ce ne soit absolument nécessaire. Vous ne ferez que compliquer les choses .

+0

Cela m'a fait réfléchir un peu plus sur la situation et je consulte les propriétaires de processus. Peut-être que nous pouvons simplement laisser la ligne hors de la base de données, à moins qu'ils n'aient besoin de savoir qu'une mesure n'a pas été prise pour la journée. – Sam

+0

Ils ont besoin de stocker la valeur null, ou au moins le fait que la valeur n'était pas disponible. – Sam

+0

@Sam Pas un problème.J'en ai discuté avec mes collègues et dans certaines situations, une valeur nulle peut être utile, par exemple: si un étudiant ne passe pas un examen, il aura une valeur nulle et pas 0.0 comme score pour l'examen, s'il avait un 0,0 serait considéré comme un échec et non comme ne pas terminer l'examen, entraînant ainsi une incohérence pour leur moyenne. –

3

Vous avez besoin du point d'interrogation? laisser Double (ou n'importe quel type de valeur) peut stocker null (ou Nothing). E.g .:

Dim num as Double? = Nothing 

Notez le? marque.

Pour stocker dans la db:

If num Is Nothing Then 
    ... System.DBNull.Value ... 
Else 
    ... num ... 
End If 

ou mieux:

If num.HasValue Then 
    ... System.DBNull.Value ... 
Else 
    ... num.Value ... 
End If 
+0

De cette façon, 0.0 est une valeur et num = Nothing est une valeur nulle qui n'est pas 0.0. – CallMeLaNN

+0

Notez que vous ne pouvez pas affecter uniquement null (ou Nothing) à stocker dans DB. C'est pourquoi .Net ont System.DBNull.Value. Vous devez effectuer l'option If Else pour stocker System.DBNull.Value ou la valeur correcte. – CallMeLaNN

+0

L'utilisation de votre syntaxe donne "Caractère non valide". J'utilise VS 2005. Peut-être est-ce une nouvelle syntaxe de framework .net? – Sam

Questions connexes