Question

Dans ma base de données, dans l'une des tables, j'ai une colonne GUID avec autoriser les valeurs NULL. J'ai une méthode avec un Guid? paramètre qui insère une nouvelle ligne de données dans la table. Cependant, lorsque je dis myNewRow.myGuidColumn = myGuid, le message d'erreur suivant s'affiche: " Impossible de convertir implicitement le type 'System.Guid?' sur 'System.Guid'. "

Était-ce utile?

La solution

L’API ADO.NET rencontre quelques problèmes lorsqu’il s’agit de gérer des types de valeur nullables (c’est-à-dire que cela ne fonctionne tout simplement pas correctement). Nous avons eu beaucoup de problèmes avec elle et nous sommes donc parvenus à la conclusion qu'il est préférable de définir manuellement la valeur sur null, par exemple.

myNewRow.myGuidColumn = myGuid == null ? (object)DBNull.Value : myGuid.Value

C’est un travail supplémentaire pénible qu’ADO.NET devrait gérer, mais il ne semble pas le faire de manière fiable (même dans la version 3.5 SP1). Cela fonctionne au moins correctement.

Nous avons également constaté des problèmes liés à la transmission de types de valeur Nullable à SqlParameters, dans lequel le code SQL généré inclut le mot clé DEFAULT au lieu de NULL pour la valeur. même approche lors de la construction des paramètres.

Autres conseils

OK; Comment est définie myGuidColumn et comment est défini myGuid?

Si myGuid est Guid? et que myGuidColumn est Guid , l'erreur est correcte: vous devrez utiliser myGuid.Value ou (Guid) myGuid pour obtenir la valeur (qui renvoie la valeur si elle est nulle), ou peut-être myGuid.GetValueOrDefault () pour retourner le zéro guid si nul.

Si myGuid est Guid et que myGuidColumn est Guid? , cela devrait fonctionner.

Si myGuidColumn est un objet , vous avez probablement besoin de DBNull.Value au lieu du null normal.

Bien sûr, si la colonne est vraiment nullable, vous pouvez simplement vous assurer qu'elle est Guid? dans le code C # ;-p

identique à la réponse de Greg Beech

myNewRow.myGuidColumn = (object)myGuid ?? DBNull.Value

Vous devez convertir null en Guidable Nullable , voici comment cela a fonctionné pour moi:

myRecord.myGuidCol = (myGuid == null) ? (Guid?)null : myGuid.Value

Essayez System.Guid.Empty où vous voulez que ce soit null

Si vous voulez éviter de travailler avec des GUID nullables dans votre code c # (personnellement, je trouve souvent fastidieux de travailler avec des types nullable), vous pouvez attribuer de bonne heure Guid.Empty aux données .NET qui sont nulles dans la base de données. De cette façon, vous n’aurez pas à vous soucier de tout ce qui se trouve dans .HasValue et vérifiez si myGuid! = Guid.Empty à la place.

ou:

    internal static T CastTo<T>(object value)
    {
        return value != DBNull.Value ? (T)value : default(T);
    }

Vous pouvez utiliser une méthode d'assistance:

public static class Ado {
    public static void SetParameterValue<T>( IDataParameter parameter, T? value ) where T : struct {
        if ( null == value ) { parameter.Value = DBNull.Value; }
        else { parameter.Value = value.Value; }
    }
    public static void SetParameterValue( IDataParameter parameter, string value ) {
        if ( null == value ) { parameter.Value = DBNull.Value; }
        else { parameter.Value = value; }
    }
}

Si vous êtes intéressé par les méthodes d'extension ...

/// <summary>
/// Returns nullable Guid (Guid?) value if not null or Guid.Empty, otherwise returns DBNull.Value
/// </summary>
public static object GetValueOrDBNull(this Guid? aGuid)
{
  return (!aGuid.IsNullOrEmpty()) ? (object)aGuid : DBNull.Value;
}

/// <summary>
/// Determines if a nullable Guid (Guid?) is null or Guid.Empty
/// </summary>
public static bool IsNullOrEmpty(this Guid? aGuid)
{
  return (!aGuid.HasValue || aGuid.Value == Guid.Empty);
}

Ensuite, vous pourriez dire: myNewRow.myGuidColumn = myGuid.GetValueOrDBNull ();

REMARQUE: Ceci insérera null lorsque myGuid == Guid.Empty , vous pouvez facilement modifier la méthode si vous souhaitez autoriser les Guids vides dans votre colonne.

Guid? _field = null;
if (myValue!="")//test if myValue has value
{
_field = Guid.Parse(myValue)
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top