可以为空的GUID

时间:2008-10-17 08:40:54

标签: c# .net sql-server guid nullable

在我的数据库中,在其中一个表中,我有一个GUID列,其中包含allow nulls。我有一个Guid的方法?在表中插入新数据行的参数。但是,当我说myNewRow.myGuidColumn = myGuid时,我收到以下错误:“无法隐式转换类型'System.Guid?'到'System.Guid'。“

10 个答案:

答案 0 :(得分:28)

在处理可空值类型时,ADO.NET API存在一些问题(即它无法正常工作)。我们已经完成了它的问题,因此得出的结论是,最好手动将值设置为null,例如。

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

ADO.NET应该处理的是额外的痛苦工作,但它似乎并不可靠(即使在3.5 SP1中)。这至少可以正常工作。

我们还看到了将可空值类型传递给SqlParameters的问题,其中生成的SQL包含关键字DEFAULT而不是NULL,因此我建议在构建参数时采用相同的方法。

答案 1 :(得分:9)

行;如何定义myGuidColumn,以及myGuid是如何定义的?

如果myGuid为Guid?且myGuidColumn为Guid,则错误是正确的:您需要使用myGuid.Value(Guid)myGuid来获取值(这将是如果它为null则抛出,或者如果为null则返回零guid。{/ 1}。

如果myGuid为myGuid.GetValueOrDefault()且myGuidColumn为Guid,那么它应该有效。

如果myGuidColumn是Guid?,您可能需要object而不是常规的null。

当然,如果列真的可以为空,那么您可能只想确保它在C#代码中为DBNull.Value ;-p

答案 2 :(得分:5)

与Greg Beech的答案相同

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

答案 3 :(得分:5)

你必须将null投射到nullable Guid,这对我有用:

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

答案 4 :(得分:4)

尝试使用System.Guid.Empty,使其为null

答案 5 :(得分:3)

如果你想避免在你的c#代码中使用可空的GUID(个人而言,我经常发现使用可空类型很麻烦),你可以在某处尽早将Guid.Empty分配给.NET数据,该数据在D b。这样,您就不必费心去处理所有.HasValue内容,只需检查是否myGuid != Guid.Empty

答案 6 :(得分:2)

或:

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

答案 7 :(得分:1)

您可以使用辅助方法:

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

答案 8 :(得分:1)

如果您使用的是扩展方法......

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

然后你可以说: myNewRow.myGuidColumn = myGuid.GetValueOrDBNull();

注意:这将在myGuid == Guid.Empty时插入null,如果您想在列中允许空Guid,则可以轻松调整方法。

答案 9 :(得分:0)

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