web-dev-qa-db-fra.com

Nullable GUID

Dans ma base de données, dans l'une des tables, j'ai une colonne GUID avec une valeur 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'. " 

26
kjv

L’API ADO.NET rencontre quelques problèmes lorsqu’il s’agit de gérer les types de valeur nullables (c’est-à-dire que cela ne fonctionne tout simplement pas correctement). Nous n’avons pas eu beaucoup de problèmes, et nous sommes donc parvenus à la conclusion qu’il était 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 cela 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. Je vous recommande donc la même approche lors de la création de paramètres.

28
Greg Beech

D'ACCORD; Comment définit-on myGuidColumn et comment définit-on myGuid?

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

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

Si myGuidColumn est object, 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

9
Marc Gravell

Vous devez transtyper null en nullable Guid, pour que cela fonctionne ainsi

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

identique à la réponse de Greg Beech

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

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

4
Imran

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 assigner tôt Guid.Empty aux données .NET qui sont nulles dans la base . De cette façon, vous n'avez pas à vous soucier de tout ce qui se passe .HasValue et à vérifier simplement si myGuid != Guid.Empty à la place.

3
Isak Savo

ou:

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

Si vous êtes dans 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 des guides vide dans votre colonne.

1
Justin

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; }
    }
}
1
TcKs
Guid? _field = null;
if (myValue!="")//test if myValue has value
{
_field = Guid.Parse(myValue)
}
0
maurox