Обработка нулевых GUID в SQL Server и строго типизированных наборах данных

У меня есть таблица на SQL-сервере:

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

ParentCategoryID предназначен для хранения значения в CategoryID, чтобы указать, какая категория является родительской. Если у него нет родителя (т.е. это высшая категория), тогда ParentCategoryID должен быть нулевым.

Я использую строго типизированные наборы данных (адаптеры таблиц), а для свойств ParentCategoryID он не позволяет ему иметь значение NULL. Я попытался изменить свойства поля в типизированном наборе данных, но в нем говорится, что попытка сделать guid «пустым» или «ничего» недопустима. Единственный вариант - выбросить исключение при нулевом значении. Это приводит к ошибке:

Значение столбца «ParentCategoryID» в таблице «Категории» - DBNull.

Так ли это, или есть способ обрабатывать нулевые идентификаторы GUID / uniqueidentifiers при использовании типизированных наборов данных?




Ответы (1)


Если вы использовали генераторы Visual Studio и все правильно определено для вашей таблицы, то столбец, допускающий значение NULL, будет генерировать следующее в вашей строго типизированной строке DataRow:

  1. Открытое свойство, названное в честь имени столбца таблицы ("ParentCategoryID").
  2. Открытый метод, обнаруживающий пустую запись ("bool IsParentCategoryIDNull ()")
  3. Открытый метод, который "обнуляет" запись ("void SetParentCategoryIDNull ()")

Учитывая, что ваша строго типизированная таблица называется «Моя» (генерирует 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, чтобы увидеть, что используется для «обнуления».

Далее, чтобы обнаружить "нулевой идентификатор":

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

Итак, теперь у вас есть три разных типа значений для представления состояния:

  1. пустая запись в базе данных / наборе данных (без родительской категории)
  2. ненулевая запись в базе данных (предположительно родительская категория)
  3. непустая запись в базе данных, которая является пустым (Guid.Empty) guid (???)

Когда я впервые столкнулся с этой проблемой, я подумал, что Guid.Empty нужно было использовать для представления нулевой записи в базе данных, но это потребовало бы специальной обработки типа guid. Используя функции оболочки, строго типизированный набор данных может обеспечить согласованную обработку любого количества столбцов, допускающих значение NULL, на основе типов в стиле структуры.

person el2iot2    schedule 08.05.2009
comment
Спасибо. У меня сработала опция Guid.Empty. Я попробовал параметр SetParentCategoryIDNull (), но он дал ту же ошибку. Guid.Empty вставляет Guid со всеми нулями. Я могу жить с этим. Другой вариант - использовать поле varchar вместо поля uniqueidentifier. - person dtc; 12.05.2009