将 HierarchyID 与 VB 一起使用时出现奇怪错误

Odd Error Using HierarchyID with VB

忽略所有这些并查看下面的更新
在 SS 2016 中,我有一个简单的 table 如下:

ID int indentity
Code hierarchyid
Name varchar(50)

在我的 VB 应用程序中,我尝试按如下方式读取数据:

Imports System.Data
Imports System.Data.SqlClient
Imports Microsoft.SqlServer.Types

    Dim Nodes As New List(Of Node)
    Using conn As New SqlConnection(My.Settings.ConnectionString)
        com = New SqlCommand("GetInfo", conn)
        com.CommandType = CommandType.StoredProcedure
        conn.Open()
        Dim rdr As SqlDataReader = com.ExecuteReader
        While rdr.Read
            Nodes.Add(New Node With {.ID = CLng(rdr(0)), .Code = CType(rdr(1), SqlHierarchyId), .Name = CStr(rdr(2))})
        End While
    End Using

其中查询 GetInfo 只是 returns SQL table 中的所有数据,而 Node 只是一个 class,其中包含 [=44] 中的三列=] table.

当我 运行 这样做时,我收到一条非常长的错误消息,其开头如下:

System.IO.FileLoadException was unhandled
FileName=Microsoft.SqlServer.Types, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91
FusionLog==== Pre-bind state information ===
LOG: DisplayName = Microsoft.SqlServer.Types, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91
 (Fully-specified)

如果我从 While 循环中删除“.Code = CType(rdr(1), SqlHierarchyId)”,我不会收到任何错误并且节点列表已正确填充。我的结论是使用 HierarchId 不知何故导致了问题。

但是错误消息对我来说毫无意义。我可以提供的唯一线索是我的项目引用 Microsoft.SQLServer.Types 是版本 13.0.0.0 而在错误消息中它被列为版本 10.0.0.0 这可能是问题所在,如果是这样,我将如何处理修复它。如果没有,我应该去哪里寻找问题?

如果您认为可能有帮助,我可以 post 完整的错误消息。
更新 问题确实是 SQL 服务器类型不匹配。如前所述,here Type System Version 的默认值是 "latest",它已过时。所以我用 "Type System Version=SQL Server 2016" 替换了 "latest" ,这给出了一个错误,它是一个无效的值。最终,我发现 "Type System Version=SQL Server 2012" 可以编译,但它现在需要 Microsoft.SqlServer.Types,Version=11.0.0.0,这不在我的系统上。我有版本 13。所以我仍然有版本不匹配的问题。现在的问题是如何指定我的连接字符串以告诉它使用版本 13。

我找到了答案。我将以下内容添加到我的 app.config 文件中:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly> 
            <assemblyIdentity name="Microsoft.SqlServer.Types" publicKeyToken="89845dcd8080cc91" culture="neutral" />
            <bindingRedirect oldVersion="10.0.0.0" newVersion="13.0.0.0" /> 
        </dependentAssembly>
    </assemblyBinding>
</runtime>

注意 "newVersion" 属性。这就是告诉 Visual Studio 使用哪个版本的 Microsoft.SqlServer.Types。