可以为空的GUID

kjv*_*kjv 27 .net c# sql-server guid nullable

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

Gre*_*ech 29

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

myNewRow.myGuidColumn = myGuid == null ? (object)DBNull.Value : myGuid.Value
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Emperor XLII - 你不能这样做,因为你想要DBNull.Value当你拥有的*是*null时,而不是它. (2认同)

Mar*_*ell 10

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

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

如果myGuid是Guid和myGuidColumn Guid?,那么它应该工作.

如果是myGuidColumn object,则可能需要DBNull.Value代替常规null.

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


小智 6

与Greg Beech的答案相同

myNewRow.myGuidColumn = (object)myGuid ?? DBNull.Value
Run Code Online (Sandbox Code Playgroud)


Cht*_*lek 5

你必须转向null一个nullable Guid,这对我有用:

myRecord.myGuidCol = (myGuid == null) ? (Guid?)null : myGuid.Value
Run Code Online (Sandbox Code Playgroud)