2013-03-12 4 views
1

Я пытаюсь получить тип данных SqlHierarchyID в C# из DataRow, который был получен из базы данных SQL Server. После вызова базы данных, если я пишу следующее:Листинг SqlHierarchyID от Datarow

var id = datarow["TreeID"]; 

А затем проверьте значение идентификатора, используя часы в визуальной студии, он держит правильное значение иерархии (и не равен нулю).

Однако любые из следующих бросить InvalidCastException:

SqlHierarchyId id2 = (SqlHierarchyId) id; 
SqlHierarchyId id3 = datarow.Field<SqlHierarchyId>("TreeID"); 
SqlHierarchyId id4 = (SqlHierarchyId)datarow["TreeID"]; 

Кроме того, спрашивая отражения для Назначают-способности, из двух объектов:

//returns false: 
SqlHierarchyId id5 = new SqlHierarchyId(); 
return id5.GetType().IsAssignableFrom(id.GetType()); 

Кроме того, пробуя " мягкий слепок»возвращает нуль:

SqlHierarchyId id6 = id as SqlHierarchyId; 
  • Пробовал все как SqlHierarchyId? тип данных бесплоден.
  • Я ссылаюсь на 32-битную сборку и попытался выполнить компиляцию моего решения в режимах 64 и 32 бит.
  • Инициализация пустого экземпляра SqlHierarchyId и последующее его назначение не помогают.

Спасибо за любую помощь!

-JT

EDIT: сборка поставляется с SQL Server Express каталог 2012 (x86) SDK.

+0

Что делает 'datarow [" TreeID "]. GetType()' return? –

+0

@Tim Он возвращает "{Name =" SqlHierarchyId "FullName =" Microsoft.SqlServer.Types.SqlHierarchyId "}" –

+0

Почти похоже на две разные версии этого типа. Если вы сравниваете Type из DataRow с 'typeof (SqlHierarchyId)', то они идентичны? Я не уверен, какие свойства проверяемого типа (возможно, «GUID»?) –

ответ

1

Как об использовании

//convert the string back into a hierarchyid 
oRow["NodeKey"] = SqlHierarchyId.Parse((string)oRow["NodeString"]); 

Я также вижу, что вы работаете с деревом, так что, возможно, этот код проекта article поможет вам

+0

Это будет работать, если у него есть «NodeString», но не решает исходный вопрос. В его примере «TreeID» является infact SqlHierarchyId, но похоже, что SQL-сервер имеет другую версию DLL-типа, а затем тот, на который он ссылался в своем проекте. В настоящее время у меня такая же проблема. – crunchy

2

У меня была такая же проблема. Оказалось, что я добавил ссылку на неправильный файл Microsoft.SqlServer.Types.dll. Для MS SQL 2008 он находится в C: \ Program Files (x86) \ Microsoft SQL Server \ 100 \ SDK \ Assemblies для MS SQL 2012 в C: \ Program Files (x86) \ Microsoft SQL Server \ 110 \ SDK \ Ассембли

+1

В основном, Microsoft.SqlServer.Types версия 10 должна использоваться для SQL Server 2008. Однако Microsoft, SqlServer.Types edge должен использоваться для SQL Server 2008 R2 и более поздних версий (например, 2012, 2014 и т. Д.). – Phil