2017-01-14 3 views
0

ignorieren all dies und sehen Sie das Update unter
Im SS 2016 habe ich eine einfache Tabelle haben wie folgt:Odd Fehler mit HierarchyID mit VB

ID int indentity 
Code hierarchyid 
Name varchar(50) 

In meinem VB-Anwendung Ich versuche, die Daten zu lesen, wie folgt:

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 

Wo die Abfrage GetInfo nur alle Daten in der SQL-Tabelle zurückgibt und Knoten ist nur eine Klasse, die die drei Spalten in der SQL-Tabelle hält.

Als ich das laufen bekomme ich eine extrem lange Fehlermeldung, die wie folgt beginnt:

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) 

Wenn ich entfernen ".CODE = CType (rdr (1), SqlHierarchyId)" aus dem Innern der While-Schleife I bekomme keinen Fehler und die Knotenliste ist richtig ausgefüllt. Meine Schlussfolgerung ist, dass die Verwendung der HierarchId irgendwie das Problem verursacht.

Aber die Fehlermeldung macht keinen Sinn für mich. Der einzige Hinweis, den ich anbieten kann, ist, dass mein Projekt Verweis auf Microsoft.SQLServer.Types Version 13.0.0.0 ist, während in der Fehlermeldung es als Version 10.0.0.0 aufgeführt ist. Könnte dies das Problem sein, und wenn ja, wie würde ich gehen es reparieren. Wenn nicht, wo sollte ich nach dem Problem suchen?

Ich kann die ganze Fehlermeldung veröffentlichen, wenn Sie denken, dass das helfen könnte.
Update Das Problem ist in der Tat eine Diskrepanz in SQL Server-Typen. Wie bereits erwähnt, ist die Standardeinstellung für Type System Version "neueste", die veraltet ist. Also habe ich "neuste" durch "Type System Version = SQL Server 2016" ersetzt, was zu einem Fehler führte, dass es sich um einen ungültigen Wert handelte. Irgendwann habe ich festgestellt, dass "Type System Version = SQL Server 2012" OK kompiliert, aber jetzt will Microsoft.SqlServer.Types, Version = 11.0.0.0, die nicht auf meinem System ist. Ich habe Version 13. Also habe ich immer noch ein Versionskonfliktproblem. Nun die Frage ist, wie gebe ich meine Verbindungszeichenfolge, um es zu sagen, Version 13 zu verwenden.

Antwort

0

Ich fand die Antwort. Ich habe meiner app.config-Datei Folgendes hinzugefügt:

<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> 

Beachten Sie das Attribut "newVersion". Das teilt Visual Studio mit, welche Version von Microsoft.SqlServer.Types verwendet werden soll.