Frage

In meiner Datenbank, in einen der Tabelle habe ich eine GUID Spalte mit allow nulls. Ich habe eine Methode mit einem Guid? Parameter, die eine neue Datenzeile in der Tabelle einfügt. Allerdings, wenn ich sage myNewRow.myGuidColumn = myGuid bekomme ich folgende Fehlermeldung: ‚? System.Guid‘ „Kann nicht implizit Typ umwandeln zu 'System.Guid'.“

War es hilfreich?

Lösung

Die ADO.NET API hat einige Probleme, wenn es darum geht, Nullable-Wertetypen Handling (das heißt, es einfach nicht richtig funktioniert). Wir haben mit ihm kein Ende der Probleme haben, und so haben zu dem Schluss gekommen, dass es am besten ist, den Wert manuell auf null festgelegt, z.

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

Es ist schmerzhaft zusätzliche Arbeit, die ADO.NET behandeln soll, aber es scheint nicht so zuverlässig (in 3.5 SP1 selbst) zu tun. Das zumindest korrekt funktioniert.

Wir haben auch Probleme gesehen mit Nullable-Wertetypen SqlParameters vorbei, wo die generierten SQL das Stichwort DEFAULT für den Wert statt NULL enthält so dass ich den gleichen Ansatz empfehlen würde, wenn die Parameter zu bauen.

Andere Tipps

OK; wie ist myGuidColumn definiert, und wie wird myGuid definiert?

Wenn myGuid ist Guid? und myGuidColumn ist Guid, dann ist der Fehler korrekt: Sie myGuid.Value verwenden müssen, oder (Guid)myGuid den Wert zu erhalten (was werfen, wenn es null ist), oder vielleicht die Null zurück myGuid.GetValueOrDefault() guid wenn null.

Wenn myGuid ist Guid und myGuidColumn ist Guid?, dann sollte es funktionieren.

Wenn myGuidColumn object ist, müssen Sie wahrscheinlich statt der regulären null DBNull.Value.

Natürlich, wenn die Spalte wirklich NULL-Werte zulässt, können Sie wollen einfach nur, um sicherzustellen, dass es Guid? in der C # -Code ;-P ist

gleiche wie Greg Beech Antwort

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

Sie haben null zu einem nullable Guid zu werfen, das, wie es für mich gearbeitet:

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

Versuchen System.Guid.Empty wo Sie es wollen null sein

Wenn Sie mit Nullable-GUIDs in C # -Code zu vermeiden, wollen arbeiten (ich persönlich finde es oft mühsam mit Nullable-Typen arbeiten), könnten Sie irgendwo früh zuweisen Guid.Empty auf die .NET-Daten, die in der db null ist. Auf diese Weise, die Sie nicht mit allen .HasValue Sachen haben zu stören und prüfen nur, ob myGuid != Guid.Empty statt.

oder:

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

Sie können eine Hilfsmethode verwenden:

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

Wenn Sie in Erweiterungsmethoden ...

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

Dann könnte man sagen: myNewRow.myGuidColumn = myGuid.GetValueOrDBNull();

. HINWEIS: Dies wird null einfügen, wenn myGuid == Guid.Empty, könnte man leicht die Methode zwicken, wenn Sie leer Guids in Ihrer Spalte zulassen möchten

Guid? _field = null;
if (myValue!="")//test if myValue has value
{
_field = Guid.Parse(myValue)
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top