Question

Champ SQLServer int. Valeur parfois nulle. DataAdapter remplit le jeu de données OK et peut afficher les données dans DatagridView OK.

Lors de la tentative de récupération des données par programmation à partir de l'ensemble de données, le code de récupération du champ jeu de données génère une erreur StronglyTypedException.

 [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    public int curr_reading {
        get {
            try {
                return ((int)(this[this.tableHistory.curr_readingColumn]));
            }
            catch (global::System.InvalidCastException e) {
                throw new global::System.Data.StrongTypingException("The value for column \'curr_reading\' in table \'History\' is DBNull.", e);
            }

Vous avez dépassé ce problème en recherchant DBNull dans l'accesseur get et en renvoyant null mais ... Lorsque la structure du jeu de données est modifiée (en cours de développement), mes modifications (sans surprise) ont disparu.

Quel est le meilleur moyen de gérer cette situation? Il semble que je suis coincé avec le traitement au niveau du jeu de données. Existe-t-il une sorte d'attribut pouvant indiquer au générateur de code automatique de laisser les modifications en place?

Était-ce utile?

La solution

Le jeu de données aura une propriété booléenne pour indiquer null.

int curr_reading = ( Iscurr_readingColumnNull) ? 
                   <default_value> : row.curr_readingColumn;

Autres conseils

Dans le concepteur de jeu de données typé, il existe la propriété nullvalue . Par défaut, sa valeur est throw exception (d'où votre code généré) Vous pouvez le régler sur la valeur par défaut désirée. 0 Ensuite, il retournera 0 au lieu d'une exception. (un autre code est généré)

VS2008: cela fonctionne directement dans le concepteur de jeu de données.

VS2005: Cela ne fonctionne que pour les chaînes du concepteur, mais vous pouvez éditer directement le fichier XSD et définir la propriété msprop: nullValue = "0"

.
  1. Laissez le code généré automatiquement. Il n’existe aucun moyen d’intercepter " il sera généré afin que tous les changements que vous apportez soient emportés tôt ou tard.

  2. .NET (du moins les bits .NET 2.0 system.data) ne convertira pas DBNull en autre chose. C'est nul, mais vous ne pouvez rien y faire.

  3. Ecrivez une méthode d'extension appelée ToNullable () ou similaire: cela peut faire ceci:

.

public static Nullable<T> ToNullable(this object x){
    if(x == DBNull.Value)
       return default(T); // return null thing
    else
       return (T)x;
}

alors vous pouvez faire

int? thing = DataRow["column"].ToNullable<int>();

Si la mémoire est bonne, vous devez marquer la ligne comme étant modifiée - en utilisant .BeginEdit () ou similaire - puis apportez vos modifications et enregistrez la ligne, probablement en utilisant .EndEdit () ou similaire. Vous voudrez peut-être faire un peu de lecture dans ces méthodes (elles peuvent être sur le DataSet, DataTable ou DataRow) - ma mémoire est un peu floue.

J'espère que cela aide au moins un peu.

if(row["curr_reading"] is DBNull){

}else{
    row.curr_reading;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top