使用带有VB的HierarchyID的奇怪错误

时间:2017-01-14 12:05:57

标签: sql-server vb.net hierarchyid

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

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只返回SQL表中的所有数据,而Node只是一个包含SQL表中三列的类。

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

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)

如果我删除" .Code = CType(rdr(1),SqlHierarchyId)"从While循环内部我没有错误,并且节点列表已正确填充。我的结论是使用HierarchId会以某种方式导致问题。

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

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

1 个答案:

答案 0 :(得分:0)

我找到了答案。我在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。