2014-09-01 46 views
4

使用SQL Server數據工具項目,其目標平臺設置爲一個Microsoft.SqlServer.Types時:RuntimeBinderInternalCompilerException使用帶有精緻小巧

  • SQL Server 2008中
  • SQL Server 2012的
  • 的SQL Server 2014

和部署到(的LocalDB)\項目或(的LocalDB)\ ProjectsV12

調用存儲過程返回一個幾何,地理或HierachyId類型如:

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

以下調用代碼:

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

導致在STEquals線以下情況例外。

Microsoft.CSharp.RuntimeBinder.RuntimeBinderInternalCompilerException 是由用戶代碼的HResult = -2146233088未處理消息=當結合一個動態操作
源= Microsoft.CSharp堆棧跟蹤發生 意外的異常: 在Microsoft.CSharp。 RuntimeBinder.RuntimeBinder.Bind(DynamicMetaObjectBinder 有效載荷,IEnumerable的1 parameters, DynamicMetaObject[] args, DynamicMetaObject& deferredBinding) at Microsoft.CSharp.RuntimeBinder.BinderHelper.Bind(DynamicMetaObjectBinder action, RuntimeBinder binder, IEnumerable 1個指定參數時,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參數,LabelTarget returnLabel) 在System.Runtime.CompilerServices.CallSiteBinder.BindCore [T](CallSite`1 部位,對象[]參數) 在System.Dynamic.UpdateDelegates.UpdateAndExecute1 [T0,TRET](調用點 站點,T0爲arg0) 在DATailor.Examples.Dapper.SqlClient.Test.AllTypesDAOTest.TestAllTypesDynamic()

回答

5

雖然根本原因是不Dapper,有一個潛在的異常被吞噬。

像使用ADO.Net代碼:

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(); 
} 

以下異常在reader.GetValue

System.InvalidCastException拋出了未處理的HResult = -2147467262
消息= [A] Microsoft.SqlServer .Types.SqlGeometry不能轉換爲 [B] Microsoft.SqlServer.Types.SqlGeometry。類型A來自 'Microsoft.SqlServer.Types,Version = 10.0.0.0,Culture = neutral, PublicKeyToken = 89845dcd8080cc91'在上下文'Default'位置 'C:\ Windows \ assembly \ GAC_MSIL \ Microsoft.SqlServer。類型\ 10.0.0.0__89845dcd8080cc91 \ Microsoft.SqlServer.Types.dll」。 類型B源於'Microsoft.SqlServer.Types,版本= 11.0.0.0, Culture = neutral,PublicKeyToken = 89845dcd8080cc91'在上下文中 '默認'在位置 'C:\ Windows \ assembly \ GAC_MSIL \ Microsoft.SqlServer .Types \ 11.0.0.0__89845dcd8080cc91 \ Microsoft.SqlServer.Types.dll」。 Source = DynamicGeometryIssue StackTrace: at DynamicGeometryIssue.TestDao。TestGeometry()中的DynamicGeometryIssue.Program.Main(String [] args)在c:\ Users \富\文件\的Visual Studio 2013 \項目\ DynamicGeometryIssue \ DynamicGeometryIssue \的Program.cs:線在System.AppDomain._nExecuteAssembly(RuntimeAssembly組件,字串[] args) 在System.AppDomain.ExecuteAssembly(字符串assemblyFile,證據assemblySecurity,字串[] args) 在Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 在System.Threading.ThreadHelper.ThreadStart_Context(對象狀態) 在System.Threading.ExecutionContext.RunInternal(EXECUT ionContext 的ExecutionContext,ContextCallback回調,對象的狀態,布爾 preserveSyncCtx) 在System.Threading.ExecutionContext.Run(的ExecutionContext的ExecutionContext,ContextCallback回調,對象的狀態,布爾 preserveSyncCtx) 在System.Threading.ExecutionContext.Run(的ExecutionContext的ExecutionContext, ContextCallback回調,對象狀態) 在System.Threading.ThreadHelper.ThreadStart()的InnerException:

底層異常的原因是在SQL Server 2012中的已知重大更改,請參見SQL CLR數據類型節以下MSDN文件心理狀態

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

的決議,已經爲我工作是在app.config或web.config中創建以下bindingRedirect。

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

或者,使用.NET 4.5,你可以改變你的連接字符串,以包括「類型系統版本」一「的SQL Server 2012」的屬性值,以強制的SqlClient加載程序集的11.0版本。

另一個解決方法是這樣的代碼:

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

不過,我不相信這是小巧玲瓏的一個選項。