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'. "
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.
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
Vous devez transtyper null
en nullable Guid
, pour que cela fonctionne ainsi
myRecord.myGuidCol = (myGuid == null) ? (Guid?)null : myGuid.Value
identique à la réponse de Greg Beech
myNewRow.myGuidColumn = (object)myGuid ?? DBNull.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 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.
ou:
internal static T CastTo<T>(object value)
{
return value != DBNull.Value ? (T)value : default(T);
}
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.
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; }
}
}
Guid? _field = null;
if (myValue!="")//test if myValue has value
{
_field = Guid.Parse(myValue)
}