【问题标题】:Handling null GUIDs in SQL Server and strongly typed datasets在 SQL Server 和强类型数据集中处理空 GUID
【发布时间】:2009-05-08 20:19:21
【问题描述】:

我在 SQL Server 中有一个表:

Categories
--------------
CategoryID (uniqueidentifier)
ParentCategoryID (uniqueidentifier) allow nulls

ParentCategoryID 用于在 CategoryID 中保存一个值,以指示哪个类别是父类别。如果它没有父类(即它是顶级类别),则 ParentCategoryID 应该为 null。

我正在使用强类型数据集(表适配器),并且对于 ParentCategoryID 的属性,它不允许它为空。我试图更改类型化数据集中字段的属性,但它说试图使 guid “空”或“无”是无效的。唯一的选择是在 null 上抛出异常。这会导致错误:

表 'Categories' 中列 'ParentCategoryID' 的值为 DBNull。

是这样吗,还是有办法在使用类型化数据集时处理空 GUID/唯一标识符?

【问题讨论】:

    标签: sql-server guid strongly-typed-dataset tableadapter null-uniqueidentifier


    【解决方案1】:

    如果您使用了 Visual Studio 生成器并且为您的表正确检测到所有内容,则可为空的列将在您的强类型 DataRow 上生成以下内容:

    1. 为表列名(“ParentCategoryID”)命名的公共属性
    2. 检测空条目的公共方法(“bool IsParentCategoryIDNull()”)
    3. 将条目“设为空”的公共方法(“void SetParentCategoryIDNull()”)

    鉴于您的强类型表命名为“My”(生成MyDataTableMyDataRow),您的DataSet 命名为MyDataSetType,实例命名为myDataSet

    MyDataSetType.MyRow row = myDataSet.My.NewMyRow();
    row.ParentCategoryID = Guid.Empty; //OPTION 1: explicitly set GUID
    row.SetParentCategoryIDNull(); //OPTION 2: explicitly set Null
    myDataSet.My.AddMyRow(row);
    

    您还可以查看SetParentCategoryID 的实现,以了解用于执行“nulling”的内容。

    进一步,检测“null guid”:

    if (row.IsParentCategoryIDNull())
    {
      //Do something spectacular
    }
    

    所以现在你有三种不同类型的值来表示状态:

    1. 数据库/数据集中的空条目(无父类别)
    2. 数据库中的非空条目(可能是父类别)
    3. 数据库中的非空条目是空 (Guid.Empty) guid (???)

    当我第一次遇到这个问题时,我认为应该使用Guid.Empty 来表示数据库中的空条目,但这需要自定义处理 guid 类型。使用包装函数,强类型数据集可以基于结构样式类型提供对任意数量可空列的一致处理。

    【讨论】:

    • 谢谢。 Guid.Empty 选项对我有用。我尝试了 SetParentCategoryIDNull() 选项,但它给出了同样的错误。 Guid.Empty 插入一个全零的 Guid。我可以忍受这一点。我的另一个选择是使用 varchar 字段而不是 uniqueidentifier 字段。
    猜你喜欢
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 2021-12-13
    • 2010-10-10
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多