Domanda

Nel mio database, in una tabella ho una colonna GUID con valori null consentiti. Ho un metodo con un Guid? parametro che inserisce una nuova riga di dati nella tabella. Tuttavia, quando dico myNewRow.myGuidColumn = myGuid, ottengo il seguente errore: " Impossibile convertire implicitamente il tipo "System.Guid?" su "System.Guid". "

È stato utile?

Soluzione

L'API ADO.NET ha alcuni problemi quando si tratta di gestire tipi di valore nullable (cioè semplicemente non funziona correttamente). Non abbiamo avuto problemi con questo e quindi siamo giunti alla conclusione che è meglio impostare manualmente il valore su null, ad es.

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

È doloroso lavoro extra che ADO.NET dovrebbe gestire, ma non sembra farlo in modo affidabile (anche in 3.5 SP1). Questo almeno funziona correttamente.

Abbiamo anche riscontrato problemi con il passaggio di tipi di valore nullable a SqlParameters in cui l'SQL generato include la parola chiave DEFAULT anziché NULL per il valore, quindi consiglio di stesso approccio durante la creazione di parametri.

Altri suggerimenti

OK; come viene definito myGuidColumn e come viene definito myGuid?

Se myGuid è Guid? e myGuidColumn è Guid , l'errore è corretto: dovrai utilizzare myGuid.Value , oppure (Guid) myGuid per ottenere il valore (che verrà generato se è nullo), o forse myGuid.GetValueOrDefault () per restituire lo zero guida se null.

Se myGuid è Guid e myGuidColumn è Guid? , allora dovrebbe funzionare.

Se myGuidColumn è oggetto , probabilmente avrai bisogno di DBNull.Value invece del normale null.

Naturalmente, se la colonna è veramente nullable, potresti semplicemente assicurarti che sia Guid? nel codice C # ;-p

uguale alla risposta di Greg Beech

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

Devi lanciare null in un nullable Guid , in questo modo ha funzionato per me:

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

Prova System.Guid.Empty dove vuoi che sia null

Se vuoi evitare di lavorare con GUID nullable nel tuo codice c # (personalmente, trovo spesso ingombrante lavorare con tipi nullable) potresti presto assegnare da qualche parte Guid.Empty ai dati .NET che sono nulli nel db. In questo modo, non devi preoccuparti di tutte le cose .HasValue e controllare invece myGuid! = Guid.Empty .

o

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

Puoi usare un metodo helper:

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

Se ti piacciono i metodi di estensione ...

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

Quindi potresti dire: myNewRow.myGuidColumn = myGuid.GetValueOrDBNull ();

NOTA: questo inserirà null quando myGuid == Guid.Empty , potresti facilmente modificare il metodo se vuoi consentire le Guide vuote nella tua colonna.

Guid? _field = null;
if (myValue!="")//test if myValue has value
{
_field = Guid.Parse(myValue)
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top