En mi base de datos, en una de las tablas tengo una columna GUID con nulos permitidos. 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' ".GUID que se puede anular
Respuesta
La API de ADO.NET tiene algunos problemas cuando se trata de manejar tipos de valores que aceptan nulos (es decir, simplemente no funciona correctamente). No hemos tenido problemas al respecto, por lo que hemos llegado a la conclusión de que lo mejor es establecer manualmente el valor en nulo, p.
myNewRow.myGuidColumn = myGuid == null ? (object)DBNull.Value : myGuid.Value
Es un trabajo extra dolorosa que ADO.NET debe manipular, pero no parece hacerlo de forma fiable (incluso en 3.5 SP1). Esto al menos funciona correctamente.
También hemos visto problemas con el paso de tipos de valores anulables a SqlParameters donde el SQL generado incluye la palabra clave DEFAULT
en lugar de NULL
para el valor, así que recomendaría el mismo enfoque al construir parámetros.
OK; ¿Cómo se define myGuidColumn y cómo se define myGuid?
Si myGuid es Guid?
y myGuidColumn es Guid
, entonces el error es correcto: usted tendrá que usar myGuid.Value
o (Guid)myGuid
para obtener el valor (que tirar si es nulo), o tal vez myGuid.GetValueOrDefault()
para devolver el GUID cero si nulo
Si myGuid es Guid
y myGuidColumn es Guid?
, entonces debería funcionar.
Si myGuidColumn es object
, probablemente necesite DBNull.Value
en lugar del nulo normal.
Por supuesto, si la columna es anulable verdad, es posible que simplemente quieren asegurarse de que es Guid?
en el código C# ;-P
Se puede utilizar 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; }
}
}
o :
internal static T CastTo<T>(object value)
{
return value != DBNull.Value ? (T)value : default(T);
}
Si se quiere evitar trabajar con GUID anulables en su código C# (personalmente, a menudo resulta engorroso trabajar con tipos anulables) que pudiera en algún culo temprana ign Guid.Empty a los datos .NET que es nulo en el db. De esta forma, no tiene que preocuparse por todas las cosas de .HasValue y simplemente verifique si myGuid != Guid.Empty
.
Ya uso un GUID vacío con un "significado" diferente. – kjv
mismo que la respuesta de Greg Haya
myNewRow.myGuidColumn = (object)myGuid ?? DBNull.Value
Try System.Guid.Empty donde quiera que sea nula
Si usted está en 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 usted podría decir: myNewRow.myGuidColumn = myGuid.GetValueOrDBNull();
NOTA: Esto inserte nulo cuando myGuid == Guid.Empty
, puede modificar fácilmente el método si desea permitir las guías vacías en su columna.
tienen que desechar null
a un nullable Guid
, así como se trabajó para mí:
myRecord.myGuidCol = (myGuid == null) ? (Guid?)null : myGuid.Value
Guid? _field = null;
if (myValue!="")//test if myValue has value
{
_field = Guid.Parse(myValue)
}
- 1. TimeSpan usando una fecha que se puede anular
- 2. ¿Alguien puede explicar que debe anular?
- 3. No se puede deserializar un KeyValuePair que se puede anular desde JSON con ASP.NET AJAX
- 4. ¿por qué jspService() no se puede anular?
- 5. no puede anular sys.excepthook
- 6. Parece que no puede anular Checkout Controller en Magento
- 7. No se puede anular Controlador de contraseñas de inventarios
- 8. ¿Se puede anular la configuración ValidateRequest de una página?
- 9. "No se puede anular el método final de SherlockActivity"
- 10. CQL: no se puede anular Verificar en "Dónde" Cláusula
- 11. Cómo convertir guid? guid
- 12. ¿Es mejor usar DateTime.MinValue o un DateTime que se puede anular?
- 13. magento no puede anular el modelo principal
- 14. no puede anular de bienes protegidos establecer
- 15. ¿Hay alguna herramienta que detecte GUID duplicados?
- 16. Usando guid en sqlite seleccione donde guid se almacena en sqlite db como binarios
- 17. Convirtiendo un Guid a Nullable Guid
- 18. Cómo validar GUID es un GUID
- 19. rails3 I18n: no se puede anular "1 error prohibido este paquete se guarden:"
- 20. Referenciando GUID
- 21. LINQ dinámico: no se puede convertir entre el GUID y la cadena
- 22. Generación de GUID
- 23. SCOPE_IDENTITY() para GUID?
- 24. no puede anular un estilo global de WPF que se establece TargetType en un solo control específico
- 25. ¿Puede anular los escritores de flujo en objetos scala @serializable?
- 26. jQuery que se puede arrastrar: el cuadro que se puede arrastrar pasa por el contenedor - ¿error?
- 27. Guid vs cadena aleatoria
- 28. Guid == null no se debe permitir por el compilador
- 29. ¿Cómo asegurarnos de que un guid generado sea único globalmente?
- 30. Android: Clave principal GUID
Tipo de expresión condicional no se puede determinar porque no hay una conversión implícita entre 'System.DBNull' y ' System.Guid ' – kjv
Ah, disculpas. Fijo. –
Puede considerar el uso del operador coalescente nulo al recuperar un valor de reserva para un posible objeto nulo: "(objeto) myGuid ?? DBNull.Value" –