Обработка нулевых идентификаторов GUID в SQL Server и строго типизированных наборах данных - PullRequest
1 голос
/ 09 мая 2009

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

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

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

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

Значением столбца 'ParentCategoryID' в таблице 'Категории' является DBNull.

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

1 Ответ

2 голосов
/ 09 мая 2009

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

  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, чтобы увидеть, что используется для "обнуления".

Далее, чтобы обнаружить «нулевого гида»:

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

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

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

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

...