在我的数据库中,在其中一个表中,我有一个允许NULL的GUID列。我有一个Guid的方法?参数在表中插入新的数据行。但是,当我说myNewRow.myGuidColumn = myGuid时出现以下错误:“不能隐式转换类型'System.Guid?'到'System.Guid'。“可为空的GUID
可为空的GUID
回答
对于处理可空值类型(即,它不能正常工作),ADO.NET API有一些问题。我们对它没有任何问题,所以得出的结论是,最好手动将该值设置为空,例如,
myNewRow.myGuidColumn = myGuid == null ? (object)DBNull.Value : myGuid.Value
ADO.NET应该处理的额外工作是痛苦的,但它似乎并不可靠(甚至在3.5 SP1中)。这至少可以正常工作。
我们还看到了将可空值类型传递给SqlParameters的问题,其中生成的SQL包含关键字DEFAULT
而不是NULL
,因此我建议在构建参数时使用相同的方法。
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
您可以使用一个辅助方法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; }
}
}
或:
internal static T CastTo<T>(object value)
{
return value != DBNull.Value ? (T)value : default(T);
}
如果你想避免在你的C#代码(个人而言,我经常发现它与繁琐可空类型的工作),你可以早的地方为空的屁股工作的GUID将Guid.Empty设置为数据库中为空的.NET数据。这样,你不必打扰所有.HasValue的东西,只是检查是否myGuid != Guid.Empty
。
一样格雷格榉木的回答,你希望它是空
尝试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,则可以轻松调整该方法。
如果你到扩展方法
myNewRow.myGuidColumn = (object)myGuid ?? DBNull.Value
你要投null
到nullable Guid
,它这个是如何为我工作:
myRecord.myGuidCol = (myGuid == null) ? (Guid?)null : myGuid.Value
Guid? _field = null;
if (myValue!="")//test if myValue has value
{
_field = Guid.Parse(myValue)
}
- 1. VB.NET:检查变量是否为Guid? (可为空)类型
- 2. 的DocuSign CreateAndSendEnvelope“GUID不能为空”
- 3. 允许空外键GUID
- 4. 在SQL中检查空Guid
- 5. System.DirectoryServices.AccountManagement.Principal是否有空GUID?
- 6. 为什么在这个linq查询中不使用可空的Guid工作?
- 7. MS图的GUID许可User.Invite.All
- 8. OpenIdConnect错误 - 租户标识符可能不是空的GUID
- 9. 可空的Guid LINQ to SQL中,则会产生意外结果
- 10. SQL Server 2012:检查列是否为GUID并且为空
- 11. 不可空列的联合可为空
- 12. guid作为主键?
- 13. Guid全为0(零)?
- 14. WCF可以处理GUID吗?
- 15. 在为Payola Stripe订阅模型创建GUID空状态
- 16. Azure活动目录为tenantId传递空GUID与默认模板
- 17. 的ASP.NET Web API:可选的Guid参数
- 18. SubSonic,GUID和MySQL空引用异常
- 19. 比较一个GUID,所以我可以通过GUID
- 20. 密钥库中的别名可以作为GUID吗?
- 21. 可空类型不可为空
- 22. 将URI转换为GUID
- 23. 将GUID转换为varchar(32)
- 24. 将GUID转换为System.Drawing.Imaging.ImageFormat
- 25. Flex:将GUID转换为Base64
- 26. 具有泛型委托的可空(Guid)导致奇怪(隐藏)错误?
- 27. 可为空的运算符。?
- 28. 值不可为空的System.DateTime
- 29. 可为空的DateTime属性
- 30. 的document.getElementById(“ID”)可以为空
无法确定条件表达式的类型,因为有“System.DBNull”和'之间的隐式转换System.Guid' – kjv 2008-10-17 08:53:49
啊,道歉。固定。 – 2008-10-17 09:19:52