1

我在 SQL Server 中有一个表:

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

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

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

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

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

4

1 回答 1

2

如果您使用了 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以查看用于执行“归零”的内容。

此外,要检测“空 guid”:

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

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

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

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

于 2009-05-08T21:19:51.747 回答