Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
Да, вы правильно читаете - использование HierarchyID допускает только один единственный корневой узел. Так оно и есть, и, насколько я знаю, обойти это невозможно, кроме введения искусственного нового «сверхкорня», который не служит никакой другой цели, кроме как позволить вам иметь несколько «подкорней» первого уровня. ...
Marc
Обновление: как указал Грег (@ Greg0) - этот ответ на самом деле неверен - см. Его ответ для более подробной информации.
разве у вас не может быть только один "неотображаемый" корень и все основные статьи на уровне 1?
Я проводил некоторое тестирование, и оказалось, что вам не нужна запись с корневым иерархическим идентификатором.
Например, обычно вам нужен один корневой узел (уровень 1) и несколько childen, но вы можете пропустить корневой узел, не имеющий корневых записей, только записи, которые начинаются на уровне 2:
//table schema
CREATE TABLE [Entity](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) NOT NULL
[Hierarchy] [hierarchyid] NOT NULL,
CONSTRAINT [PK_Entity] PRIMARY KEY CLUSTERED
(
[ID] ASC
)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
//Insert first 'root', which is technicall a child without a parent
INSERT INTO [Entity]
([Name]
,[Description]
,[Hierarchy])
VALUES
('Root A'
,hierarchyid::GetRoot().GetDescendant(NULL,NULL))
//Create the second 'root'
INSERT INTO [Entity]
([Name]
,[Hierarchy])
VALUES
('Root B'
,hierarchyid::GetRoot().GetDescendant((select MAX(hierarchy) from entity where hierarchy.GetAncestor(1) = hierarchyid::GetRoot()),NULL))
Теперь, если вы выберете все строки из таблицы, вы увидите:
SELECT [ID]
,[Name]
,[Hierarchy],
[Hierarchy].ToString()
FROM [Entity]
Иерархия имен идентификаторов (без имени столбца)
1 корень A 0x58 / 1 /
2 Корень B 0x68 / 2 /
Я не уверен, что это будет рекомендованная практика, но концептуально она позволяет иметь несколько корней, если вы рассматриваете 2-й уровень в дереве как корень