可以为空的GUID

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

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

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

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

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

好; 如何定义myGuidColumn,myGuid是如何定义的?

如果myGuid是Guid? 并且myGuidColumn是Guid ,那么错误是正确的:您将需要使用myGuid.Value(Guid)myGuid来获取值(如果它为null将抛出),或者可能是myGuid.GetValueOrDefault()返回零guid如果为null。

如果myGuid是Guid而myGuidColumn是Guid? 那么它应该工作。

如果myGuidColumn是object ,则可能需要DBNull.Value而不是常规null。

当然,如果列真的可以为空,你可能只想确保它是Guid? 在C#代码中;-p

与Greg Beech的答案相同

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

你必须将null为可以为nullable Guid ,这对我nullable Guid

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

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

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

要么:

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

您可以使用辅助方法:

 public static class Ado { public static void SetParameterValue( 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; } } } 

如果您正在使用扩展方法……

 ///  /// Returns nullable Guid (Guid?) value if not null or Guid.Empty, otherwise returns DBNull.Value ///  public static object GetValueOrDBNull(this Guid? aGuid) { return (!aGuid.IsNullOrEmpty()) ? (object)aGuid : DBNull.Value; } ///  /// Determines if a nullable Guid (Guid?) is null or Guid.Empty ///  public static bool IsNullOrEmpty(this Guid? aGuid) { return (!aGuid.HasValue || aGuid.Value == Guid.Empty); } 

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

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

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