无法加载文件或程序集&System; System.Data.DataSetExtensions

时间:2017-03-20 20:45:09

标签: sql-server .net-assembly sqlclr

这是我第一次使用SQL Server 2012,而且我在访问数据库时遇到问题。我从SQL Server 2008 R2数据库进行了备份和还原,设置了登录和权限,将数据库设置为可信并启用了clr。

我正在使用Web应用程序(IIS,ASP.Net)连接到数据库。当我将Web服务器指向新数据库时,我收到以下错误。当我将它指向SQL Server 2008 R2计算机上的数据库副本时,它会连接。

我正在以2.0 / 3.5版本运行该应用程序,并尝试确保所有内容都指向该框架。我已经验证了dll是在两个数据库服务器上的相同文件夹中。

错误讯息:

  

在执行用户定义的例程或聚合期间发生.NET Framework错误" clrSP_UserData_PermList":
  System.IO.FileNotFoundException:无法加载文件或程序集&System; System.Data.DataSetExtensions,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'或其中一个依赖项。该系统找不到指定的文件。

     

System.IO.FileNotFoundException:无法加载文件或程序集&System; System.Data.DataSetExtensions,Version = 3.5.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'或其中一个依赖项。系统找不到指定的文件。

     

System.IO.FileNotFoundException:

     

at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializerContract.CanSerialize(Type type)
  在System.Xml.Serialization.TempAssembly.LoadGeneratedAssembly(Type type,String defaultNamespace,XmlSerializerImplementation& contract)
  在System.Xml.Serialization.XmlSerializer..ctor(Type type,String defaultNamespace)
  在Testdb.SqlServer.SqlUtility.XmlSerialize(Object oSerializableObject)
  在Testdb.SqlServer.StoredProcedures.clrSP_UserData_ PermList(Guid gUserID,SqlChars& sqlCharList)

我在互联网上搜索了好几天,我找不到适合这个数据库的解决方案(启用了clr,安装了正确的框架等等。)。

2 个答案:

答案 0 :(得分:0)

鉴于 System.Data.DataSetExtensions 不在Supported .NET Framework Libraries列表中,我将假设您通过{{1}手动将其手动加载到SQL Server中(因此你必须启用CREATE ASSEMBLY)。由于您恢复了数据库,因此其中的所有程序集都随之而来(这在大多数情况下都是好事)。但是,在这种特殊情况下它并没有那么有用。问题是SQL Server的CLR主机受到高度限制,并且链接到特定的CLR版本。 SQL Server 2005,2008和2008 R2链接到CLR 2.0及其相关的.NET Framework版本(2.0,3.0和3.5),而SQL Server 2012和更新版仅链接到CLR 4.0及其相关的.NET Framework版本( 4.0及更新)。因为您是在2008 R2上启动的,所以您手动加载了.NET 3.5版本的 System.Data.DataSetExtensions 。但是现在数据库在SQL Server 2012中运行,CLR 4.0将不会加载为CLR 2.0 / Framework 3.5版编译的库。您需要使用4.0版本替换数据库中现有的 System.Data.DataSetExtensions

  1. 由于 System.Data.DataSetExtensions 是与您的程序集关联的依赖项,我认为这不会起作用,但您可以尝试删除它并重新添加它。

  2. 如果删除和重新创建不起作用,您可以尝试在其上执行TRUSTWORTHY,这是当前定义的就地替换。您何时可以ALTER ASSEMBLY进行限制,但我认为它没有任何暴露于SQLCLR的方法,这可能会让它真正发挥作用。

  3. 如果前两个想法不起作用,那么您需要删除大会,然后 System.Data.DataSetExtensions ,然后重新创建 System.Data .DataSetExtensions 与4.0版本,然后重新部署您的程序集。

  4. 在你管理完之后,交叉手指,祈祷,做产品,擦一只幸运的兔子的脚,希望a) System.Data.DataSetExtensions 没有变成混合-mode程序集(在任何时间点,从4.0的初始版本到当前的4.6.2或最新的Framework版本),以及b)您还没有使用 System.ServiceModel 因为它已经在4.0转换中从纯MSIL更改为混合模式,因此在SQL Server 2012中开始无法加载,因为SQL Server的CLR主机中的一个限制是只允许使用纯MSIL程序集。

答案 1 :(得分:0)

感谢您的回复。我们的网络今天已经关闭,我只是看到了这些。我将研究CLR的不同之处,看看能否解决问题。