web-dev-qa-db-fra.com

Meilleure façon de gérer Datarow DBNull

Dupliquer possible:
Meilleur moyen de vérifier si une table de données contient une valeur nulle

Je veux savoir quel devrait être le moyen de vérifier DBNull pour un DataTable - DataRow.

Ex

J'ai un DataRow qui récupère les informations de la base de données à partir de lignes comme:

varchar, money, Int et ainsi de suite.

Quelle devrait être mon approche (simple et douce) pour gérer une telle situation?.

15
A Developer

Essayer:

foreach(DataRow row in table.Rows)
{
    object value = row["ColumnName"];
    if (value == DBNull.Value)
    {

    }
    else
    {
    }
}
20
Shree

Essaye ça

Pour varchar

string val = dr["name"].ToString();

Pour int

int? val = dr["status"] == DBNull.Value ? (int?) null : Convert.ToInt32(dr["status"]);

Faites la même chose pour Money, Decimal comme pour int en remplaçant par les types .Net respectifs

5
codingbiz

Vous pouvez utiliser une méthode d'extension comme celle-ci;

public static T GetValue<T>(this OracleDataReader reader, string fieldName)
{
    T result = default(T);
    int index = reader.GetOrdinal(fieldName);

    if (reader.IsDBNull(index))
    {
        return default(T);
    }

    if (typeof(T) == typeof(string))
    {
        result = (T)Convert.ChangeType(reader.GetString(index), typeof(T));
    }

    if (typeof(T) == typeof(int))
    {
        result = (T)Convert.ChangeType(reader.GetInt32(index), typeof(T));
    }

    if (typeof(T) == typeof(DateTime))
    {
        result = (T)Convert.ChangeType(reader.GetDateTime(index), typeof(T));
    }

    if (typeof(T) == typeof(byte[]))
    {
        OracleLob blob = reader.GetOracleLob(index);
        result = (T)Convert.ChangeType(blob.Value, typeof(T));
    }

    return result;
}

Et vous pouvez utiliser comme string title = reader.GetValue<string>("title")

1
Mehmet Osmanoglu

Il existe mappages clairement définis pour les types CLR et SQL, la question est donc de savoir comment mapper efficacement et avec précision ces types. À long terme, le moyen le plus simple consiste probablement à utiliser un processus de mappage automatisé qui mappe les propriétés de votre classe sur les colonnes de la variable DataRow. Vous pouvez écrire le vôtre ou trouver de nombreux exemples/produits en ligne (n'importe quel ORM en fait une fonctionnalité essentielle).

En supposant que vous souhaitiez toujours effectuer des affectations manuelles, vous devez déterminer comment vous souhaitez gérer les valeurs NULL de la base de données. Voulez-vous les affecter à un type nullable correspondant? voulez-vous utiliser default(T)? voulez-vous utiliser une autre valeur (la valeur par défaut peut être un substitut médiocre de null)? Par exemple, une température de 0 degré est parfaitement valide, mais default(float) == 0. Si vous utilisez default(T), vous ne pourrez peut-être pas faire la différence entre zéro et une valeur nulle dans la base de données.

Une fois que vous avez défini votre stratégie d’affectation, placez le code sous une forme réutilisable (méthodes d’extension, classe d’aide, etc.). Préférez unboxing au type exact lorsque cela est possible, car ce sera le plus rapide. Suite à cela, unbox pour taper, puis jette. Ensuite, utilisez la classe Convert.

0
Tim Medora