2010-09-23 19 views
0

S'il vous plaît quelqu'un peut-il me conseiller s'il est possible de décaler une structure personnalisée qui peut être assignée Nothing et/ou DbNull.Values, et peut également être instanciée comme Nothing? Ce que je cherche à faire est ceate un objet DateTime personnalisé qui peut recevoir un DBNull.Value à partir d'une requête de base de données et aussi commencer la vie comme Nothing. Est-ce possible?Structure personnalisée pouvant être affectée Nothing et/ou DBNull?

Merci d'avance.

Meilleures salutations, Duane

Répondre

2

On dirait Nullable<DateTime> (DateTime? pour faire court, ou Date? en VB.NET) vous permet de presque tout le chemin. Vous avez juste besoin de traiter spécialement avec la conversion de/à DBNull par vous-même.

// You can set a DateTime? to null. 
DateTime? d = null; 

// You can also set it to a DateTime. 
d = DateTime.Now; 

// You can check whether it's null in one of two ways: 
if (d == null || !d.HasValue) // (These mean the same thing.) 
{ } 

// Boxing a DateTime? will either result in null or a DateTime value. 
SetDatabaseValue(d); 

// As for conversions from DBNull, you'll have to deal with that yourself: 
object value = GetDatabaseValue(); 
d = value is DBNull ? null : (DateTime?)value; 
+0

Salut Dan, Merci pour votre réponse, une grande solution, mais je devrais probablement me suis fait un peu plus clair avec ce que je cherche. Ce que je veux faire est de créer un nouvel objet DateTime personnalisé qui peut accepter un système valide DateTime, un DBull.value ou peut être défini sur Nothing (nous utilisons VB, mais je suis familier avec la syntaxe C#). Je ne voulais pas vraiment convertir toutes les déclarations DateTime en cours dans le projet à Nullable (de DateTime) (ou DateTime?) Et ensuite modifier tout le code où ces objets sont accédés pour rechercher la propriété .HasValue. – Dib

+0

Suite .. Il y a tout simplement trop de code à changer (nous sommes en train de convertir un énorme projet VB6 en .Net 3.5). Ce que je veux faire est de créer une seule structure personnalisée qui gère tout le contrôle et la boxe de manière intentionnelle afin que nous puissions simplement échanger la structure System.DateTime avec notre structure personnalisée DateTime. J'espère que cela aide à expliquer le plan un peu mieux! Cordialement, Duane. – Dib

+0

@Dib: Donc, une question très importante est: voulez-vous que ce soit un * 'Class' * ou un *' Structure' *? Cela devient une situation particulièrement délicate dans VB.NET, parce que vous pouvez prendre une 'Structure' et la définir sur' Nothing' * mais ce ne sera pas vraiment 'Nothing' *; il aura juste la valeur par défaut (par exemple, 0) pour ce type. Cela dit, si vous pouvez me répondre, je pense que je peux vous aider un peu plus. –

0

Si vous travaillez avec des jeux de données, utilisez le champ et SetField DataRow extension methods. Cela vous permet d'utiliser des types Nullable sans vous soucier de DBNull. Par exemple, supposons que le champ "MyDateField" (de type DateTime) est nullable. Ensuite, vous pouvez faire quelque chose comme ceci:

foreach (var row in myDataTable) 
{ 
    // will return null if the field is DbNull 
    var currentValue = row.Field<DateTime?>("MyDateField"); 

    // will set the value to DbNull.Value 
    row.SetField<DateTime?>("MyDateField", null); 
} 
+0

Salut jeroenh, Merci pour votre réponse. Je n'ai pas vu la méthode SetField utilisée auparavant; va regarder dans cela. – Dib