C# 从Datarow转换SqlHierarchyID

C# 从Datarow转换SqlHierarchyID,c#,sql-server,sqlclr,hierarchyid,C#,Sql Server,Sqlclr,Hierarchyid,我试图从SQL Server数据库中提取的数据行中检索C#中的SqlHierarchyID数据类型。在数据库调用之后,如果我编写以下内容: var id = datarow["TreeID"]; 然后在VisualStudio中使用手表检查id的值,它持有正确的层次结构值(并且为非null) 但是,以下任何和所有情况都会引发InvalidCastException: SqlHierarchyId id2 = (SqlHierarchyId) id; SqlHierarchyId id3 = d

我试图从SQL Server数据库中提取的数据行中检索C#中的SqlHierarchyID数据类型。在数据库调用之后,如果我编写以下内容:

var id = datarow["TreeID"];
然后在VisualStudio中使用手表检查id的值,它持有正确的层次结构值(并且为非null)

但是,以下任何和所有情况都会引发InvalidCastException:

SqlHierarchyId id2 = (SqlHierarchyId) id;
SqlHierarchyId id3 = datarow.Field<SqlHierarchyId>("TreeID");
SqlHierarchyId id4 = (SqlHierarchyId)datarow["TreeID"];
此外,尝试“软强制转换”会返回null:

SqlHierarchyId id6 = id as SqlHierarchyId;
  • 作为一个SqlHierarchyId尝试一切?数据类型是无效的
  • 我正在引用32位程序集,并尝试在64位和32位模式下编译我的解决方案
  • 初始化一个空的SqlHierarchyId实例,然后分配它是没有帮助的
谢谢你的帮助

-JT

编辑:程序集来自SQL Server Express 2012(x86)SDK目录。

使用

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

我还看到您正在使用一个树,因此希望此代码项目能够帮助您

我也遇到了同样的问题。结果是我添加了一个指向错误Microsoft.SqlServer.Types.dll的链接。对于MS SQL 2008,它位于C:\Program Files(x86)\Microsoft SQL Server\100\SDK\Assemblys For MS SQL 2012中的C:\Program Files(x86)\Microsoft SQL Server\110\SDK\Assemblys

什么是
datarow[“TreeID”].GetType()
return?@Tim它返回“{Name=“SqlHierarchyId”FullName=“Microsoft.SqlServer.Types.SqlHierarchyId”}”听起来好像有两种不同的类型。如果将数据行中的类型与
typeof(SqlHierarchyId)
进行比较,它们是否相同?我不确定要检查类型的哪些属性(可能是
GUID
?)此外,您是使用新的SQL 2012程序集检索数据,还是仅从System.data.SQL命名空间中检索类?如果下面的帖子满足您的需要,您能将其标记为答案吗?感谢如果他有“无限制”但没有解决原来的问题,这将起作用。在他的示例中,“TreeID”实际上是一个SqlHierarchyId,但看起来SQL服务器的DLL类型版本与他在项目中引用的不同。我目前也有同样的问题。基本上,SQL Server 2008应该使用Microsoft.SqlServer.Types版本10。但是,SQL Server 2008 R2及更高版本(如2012、2014等)应使用Microsoft的SqlServer.Types边缘。
//convert the string back into a hierarchyid
oRow["NodeKey"] = SqlHierarchyId.Parse((string)oRow["NodeString"]);