31

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

4

10 回答 10

32

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

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

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

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

于 2008-10-17T08:48:01.363 回答
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

于 2008-10-17T08:48:29.943 回答
6

与格雷格·比奇的回答相同

myNewRow.myGuidColumn = (object)myGuid ?? DBNull.Value
于 2008-10-17T12:05:00.437 回答
6

您必须转换null为 a nullable Guid,这对我来说是如何工作的:

myRecord.myGuidCol = (myGuid == null) ? (Guid?)null : myGuid.Value
于 2014-11-02T12:46:12.513 回答
4

在您希望它为空的地方尝试 System.Guid.Empty

于 2011-06-15T14:03:04.673 回答
3

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

于 2008-10-17T10:33:45.847 回答
2

或者:

    internal static T CastTo<T>(object value)
    {
        return value != DBNull.Value ? (T)value : default(T);
    }
于 2008-10-17T10:19:57.697 回答
1

您可以使用辅助方法:

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; }
    }
}
于 2008-10-17T09:15:44.893 回答
1

如果您喜欢扩展方法...

/// <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();

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

于 2013-05-08T14:43:16.100 回答
0
Guid? _field = null;
if (myValue!="")//test if myValue has value
{
_field = Guid.Parse(myValue)
}
于 2015-10-19T11:59:46.167 回答