RuntimeBinderInternalCompilerException bei Verwendung von Microsoft.SqlServer.Types mit Dapper

.net dapper sql-server

Frage

Verwenden eines Sql Server Data Tools-Projekts, dessen Zielplattform auf einen der folgenden Werte gesetzt ist:

  • SQL Server 2008
  • SQL Server 2012
  • SQL Server 2014

Und Bereitstellen in (localdb) \ Projects oder (localdb) \ ProjectsV12

Aufrufen einer gespeicherten Prozedur, die einen Geometry-, Geography- oder HierachyId-Typ zurückgibt:

CREATE PROCEDURE [dbo].[SelectSqlGeometry]
    @x Geometry
AS
    SELECT @x as y
RETURN 0

Der folgende aufrufende Code:

var result = Connection.Query("dbo.SelectSqlGeometry", new { x = geometry }, commandType: CommandType.StoredProcedure).First();
bool isSame = ((bool)geometry.STEquals(result.y));

führt zu der folgenden Ausnahme in der STEquals-Zeile.

Microsoft.CSharp.RuntimeBinder.RuntimeBinderInternalCompilerException wurde von Benutzercode nicht behandelt HResult = -2146233088 Message = Eine unerwartete Ausnahme ist beim Binden einer dynamischen Operation aufgetreten
Quelle = Microsoft.CSharp StackTrace: bei Microsoft.CSharp.RuntimeBinder.RuntimeBinder.Bind (DynamicMetaObjectBinder-Nutzlast, IEnumerable 1 parameters, DynamicMetaObject[] args, DynamicMetaObject& deferredBinding) at Microsoft.CSharp.RuntimeBinder.BinderHelper.Bind(DynamicMetaObjectBinder action, RuntimeBinder binder, IEnumerable 1 args, IEnumerable 1 arginfos, DynamicMetaObject onBindingError) at Microsoft.CSharp.RuntimeBinder.CSharpConvertBinder.FallbackConvert(DynamicMetaObject target, DynamicMetaObject errorSuggestion) at System.Dynamic.DynamicMetaObject.BindConvert(ConvertBinder binder) at System.Dynamic.ConvertBinder.Bind(DynamicMetaObject target, DynamicMetaObject[] args) at System.Dynamic.DynamicMetaObjectBinder.Bind(Object[] args, ReadOnlyCollection 1-Parameter, LabelTarget returnLabel) bei System.Runtime.CompilerServices.CallSiteBinder.BindCore [T] (CallSite`1 Site, Object [] args) bei System.Dynamic.UpdateDelegates.UpdateAndExecute1 [T0, TRet] (CallSite-Site, T0 arg0) bei DATailor.Examp les.Dapper.SqlClient.Test.AllTypesDAOTest.TestAllTypesDynamic ()

Akzeptierte Antwort

Obwohl die Ursache nicht Dapper ist, gibt es eine zugrunde liegende Ausnahme, die verschluckt wird.

Verwenden von ADO.Net-Code wie:

var geometry = Util.CreateSqlGeometry();
SqlDataReader reader=null;
SqlCommand cmd=null;
try
{
    cmd = new SqlCommand("dbo.SelectSqlGeometry", (SqlConnection)Connection);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add(new SqlParameter("@x", geometry) { UdtTypeName = "Geometry" });
    cmd.ExecuteNonQuery();
    reader = cmd.ExecuteReader();
    while (reader.Read())
    {
        var y = (SqlGeometry)reader.GetValue(0);
        var same = geometry.STEquals(y);
    }
    reader.Dispose();
    reader = null;
}
finally
{
    if (reader != null)
    {
        if (!reader.IsClosed) try { cmd.Cancel(); }
            catch {}
        reader.Dispose();
    }
    if (cmd != null) cmd.Dispose();
    Connection.Close();
}

Die folgende Ausnahme wird bei reader.GetValue

System.InvalidCastException wurde nicht behandelt HResult = -2147467262
Nachricht = [A] Microsoft.SqlServer.Types.SqlGeometry kann nicht in [B] Microsoft.SqlServer.Types.SqlGeometry umgewandelt werden. Typ A stammt von 'Microsoft.SqlServer.Types, Version = 10.0.0.0, Culture = Neutral, PublicKeyToken = 89845dcd8080cccc' im Kontext 'Standard' am Speicherort 'C: \ Windows \ Assembly \ GAC_MSIL \ Microsoft.SqlServer.Types \ 10.0 .0.0__89845dcd8080cc91 \ Microsoft.SqlServer.Types.dll '. Typ B stammt von 'Microsoft.SqlServer.Types, Version = 11.0.0.0, Culture = Neutral, PublicKeyToken = 89845dcd8080cc91' im Kontext 'Standard' am Speicherort 'C: \ Windows \ Assembly \ GAC_MSIL \ Microsoft.SqlServer.Types \ 11.0 .0.0__89845dcd8080cc91 \ Microsoft.SqlServer.Types.dll '. Quelle = DynamicGeometryIssue StackTrace: bei DynamicGeometryIssue.TestDao.TestGeometry () in C: \ Benutzer \ Rich \ Dokumente \ Visual Studio 2013 \ Projekte \ DynamicGeometryIssue \ DynamicGeometryIssue \ TestDao.cs: Zeile 27 bei DynamicGeometryIssue.Program.Main (String [] args ) in c: \ Benutzer \ Rich \ Dokumente \ Visual Studio 2013 \ Projekte \ DynamicGeometryIssue \ DynamicGeometryIssue \ Program.cs: Zeile 15 bei System.AppDomain._nExecuteAssembly (RuntimeAssembly-Assembly, String [] args) bei System.AppDomain.ExecuteAssembly (String assemblyFile, Evidence assemblySecurity, String [] args) bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly () bei System.Threading.ThreadHelper.ThreadStart_Context (Object state) unter System.Threading.ExecutionContext.RunInternal (ExecutionContext executionContext, ContextCallback Callback, Object Status, Boolean preserveSyncCtx) bei System.Threading.ExecutionContext.Run (ExecutionContext executionContext, ContextCallback-Callback, Object-Status, Boolean preserveSyncCtx) bei System.Threading.Execu tionContext.Run (ExecutionContext executionContext, ContextCallback-Callback, Objektstatus) bei System.Threading.ThreadHelper.ThreadStart () InnerException:

Die Ursache der zugrunde liegenden Ausnahme ist eine bekannte Änderung in SQL Server 2012. Siehe den Abschnitt SQL CLR-Datentypen in der folgenden MSDN-Dokumentation

http://msdn.microsoft.com/en-us/library/ms143179(v=sql.110).aspx

Die Auflösung, die für mich funktioniert hat, ist das Erstellen der folgenden bindingRedirect in der app.config oder web.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="11.0.0.0"/>
  </dependentAssembly>
</assemblyBinding>
</runtime>

Alternativ dazu können Sie mit .NET 4.5 Ihre Verbindungszeichenfolge ändern, um den Wert "SQL Server 2012" für das Attribut "Type System Version" einzufügen, damit SqlClient Version 11.0 der Assembly lädt.

Eine andere Problemumgehung ist Code wie:

var geo = SqlGeography.Deserialize(rdr.GetSqlBytes(0));

Ich glaube jedoch nicht, dass dies eine Option bei Dapper ist.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow