2008-10-17 71 views
24

在我的数据库中,在其中一个表中,我有一个允许NULL的GUID列。我有一个Guid的方法?参数在表中插入新的数据行。但是,当我说myNewRow.myGuidColumn = myGuid时出现以下错误:“不能隐式转换类型'System.Guid?'到'System.Guid'。“可为空的GUID

回答

27

对于处理可空值类型(即,它不能正常工作),ADO.NET API有一些问题。我们对它没有任何问题,所以得出的结论是,最好手动将该值设置为空,例如,

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

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

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

+0

无法确定条件表达式的类型,因为有“System.DBNull”和'之间的隐式转换System.Guid' – kjv 2008-10-17 08:53:49

+0

啊,道歉。固定。 – 2008-10-17 09:19:52

9

OK; myGuidColumn如何定义,以及myGuid如何定义?

如果myGuid是Guid?和myGuidColumn是Guid,那么错误是正确的:你将需要使用myGuid.Value,或(Guid)myGuid得到的值(如果为null,将抛出),或者myGuid.GetValueOrDefault()返回零GUID如果为空。

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

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

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

1

您可以使用一个辅助方法Guid?

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

或:

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

如果你想避免在你的C#代码(个人而言,我经常发现它与繁琐可空类型的工作),你可以早的地方为空的屁股工作的GUID将Guid.Empty设置为数据库中为空的.NET数据。这样,你不必打扰所有.HasValue的东西,只是检查是否myGuid != Guid.Empty

5

一样格雷格榉木的回答,你希望它是空

4

尝试System.Guid.Empty ...

/// <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,则可以轻松调整该方法。

1

如果你到扩展方法

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

你要投nullnullable Guid,它这个是如何为我工作:

myRecord.myGuidCol = (myGuid == null) ? (Guid?)null : myGuid.Value 
0
Guid? _field = null; 
if (myValue!="")//test if myValue has value 
{ 
_field = Guid.Parse(myValue) 
}