Pregunta

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 puedo convertir implícitamente el tipo 'System.Guid?' a 'System.Guid'. "

¿Fue útil?

Solución

La API de ADO.NET tiene algunos problemas cuando se trata de manejar tipos de valores anulables (es decir, simplemente no funciona correctamente). No hemos tenido un final de problemas con él, 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 trabajo extra doloroso que ADO.NET debe manejar, pero no parece hacerlo de manera confiable (incluso en 3.5 SP1). Esto al menos funciona correctamente.

También hemos visto problemas al pasar tipos de valores que aceptan valores nulables a SqlParameters donde el SQL generado incluye la palabra clave DEFAULT en lugar de NULL para el valor, así que recomiendo El mismo enfoque al construir parámetros.

Otros consejos

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

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

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

Si myGuidColumn es objeto , es probable que necesite DBNull.Value en lugar del nulo normal.

Por supuesto, si la columna es realmente anulable, es posible que simplemente desee asegurarse de que esté Guid? en el código C # ;-p

igual que la respuesta de Greg Beech

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

Tienes que convertir null en un Guid , de esta forma funcionó para mí:

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

Prueba System.Guid.Empty donde quieras que sea nulo

Si desea evitar trabajar con GUID que admiten nulos en su código c # (personalmente, a menudo me resulta incómodo trabajar con tipos que admiten nulos). en-us / library / system.guid.empty.aspx "rel =" nofollow noreferrer "> Guid.Empty a los datos .NET que están nulos en la base de datos. De esa manera, no tienes que preocuparte por todas las cosas de .HasValue y simplemente comprueba si myGuid! = Guid.Empty en su lugar.

o:

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

Puedes usar un método auxiliar:

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 estás 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 podrías decir: myNewRow.myGuidColumn = myGuid.GetValueOrDBNull ();

NOTA: Esto insertará nulo cuando myGuid == Guid.Empty , puede modificar fácilmente el método si desea permitir Guids vacíos en su columna.

Guid? _field = null;
if (myValue!="")//test if myValue has value
{
_field = Guid.Parse(myValue)
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top