NULLable GUID
-
03-07-2019 - |
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'. "
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)
}