代码之家  ›  专栏  ›  技术社区  ›  dtc

在SQL Server和强类型数据集中处理空guid

  •  1
  • dtc  · 技术社区  · 15 年前

    我在SQL Server中有一个表:

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

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

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

    表“categories”中列“parentCategoryID”的值为dbnull。

    使用类型化数据集时是这样,还是有办法处理空的guid/uniqueidentifiers?

    1 回复  |  直到 9 年前
        1
  •  2
  •   el2iot2    15 年前

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

    1. 为表列名命名的公共属性(“ParentCategoryID”)
    2. 检测空项的公共方法(“bool isparentCategoryIDnull()”)
    3. “空”该项的公共方法(“void setParentCategoryIDNull())

    假设强类型表名为“my”(生成 MyDataTable MyDataRow 你的 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 看看用来做“无效”的是什么。

    此外,要检测“空guid”:

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

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

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

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