c# .net sql-server guid nullable

c# - GUID Nullable



.net sql-server (10)

En mi base de datos, en una de las tablas tengo una columna GUID con permitir nulos. Tengo un método con un Guid? parámetro que inserta una nueva fila de datos en la tabla. Sin embargo, cuando digo myNewRow.myGuidColumn = myGuid, aparece el siguiente error: "¿No se puede convertir implícitamente el tipo ''System.Guid?'' a ''System.Guid'' ".


DE ACUERDO; ¿Cómo se define myGuidColumn y cómo se define myGuid?

Si myGuid es Guid? y myGuidColumn es Guid , entonces el error es correcto: tendrá que usar myGuid.Value , o (Guid)myGuid para obtener el valor (que arrojará si es nulo), o quizás myGuid.GetValueOrDefault() para devolver el cero guid si es nulo

Si myGuid es Guid y myGuidColumn es Guid? , entonces debería funcionar.

Si myGuidColumn es un object , probablemente necesite DBNull.Value lugar del valor nulo normal.

Por supuesto, si la columna es realmente anulable, ¿simplemente querrá asegurarse de que sea Guid? en el código C # ;-p


Debes lanzar null a un nullable Guid con null , así es como funcionó para mí:

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


La API ADO.NET tiene algunos problemas cuando se trata de manejar tipos de valores que aceptan valores (es decir, simplemente no funciona correctamente). No hemos tenido problemas al respecto, por lo que hemos llegado a la conclusión de que es mejor establecer manualmente el valor en nulo, por ejemplo

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

Es un doloroso trabajo adicional que ADO.NET debe manejar, pero parece que no lo hace de manera confiable (incluso en 3.5 SP1). Esto al menos funciona correctamente.

También hemos visto problemas con la transferencia de tipos de valores que se pueden nulos a SqlParameters, donde el SQL generado incluye la palabra clave DEFAULT lugar de NULL para el valor, por lo que recomendaría el mismo enfoque al construir parámetros.


Pruebe System.Guid.Empty donde desee que sea nulo


Puedes usar un método de ayuda:

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 desea evitar trabajar con GUID anulables en su código c # (personalmente, a menudo me resulta engorroso trabajar con tipos que aceptan nulos), podría en algún momento asignarle Guid.Empty a los datos .NET que son nulos en la base de datos. De esta forma, no tiene que preocuparse por todas las cosas de .HasValue y simplemente comprobar si myGuid != Guid.Empty en myGuid != Guid.Empty lugar.


Si te gustan los métodos de extensión ...

/// <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); }

Entonces podría decir: myNewRow.myGuidColumn = myGuid.GetValueOrDBNull();

NOTA: Esto insertará null cuando myGuid == Guid.Empty , podría modificar fácilmente el método si quiere permitir Guiones vacíos en su columna.


igual que la respuesta de Greg Beech

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


o:

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


Guid? _field = null; if (myValue!="")//test if myValue has value { _field = Guid.Parse(myValue) }