可以为空的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) }