【问题标题】:Could not load file or assembly 'System.Data.DataSetExtensions无法加载文件或程序集'System.Data.DataSetExtensions
【发布时间】:2017-08-12 07:44:30
【问题描述】:

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

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

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

错误信息:

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

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

System.IO.FileNotFoundException:

在 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializerContract.CanSerialize(类型类型)
在 System.Xml.Serialization.TempAssembly.LoadGeneratedAssembly(类型类型,字符串 defaultNamespace,XmlSerializerImplementation& 合同)
在 System.Xml.Serialization.XmlSerializer..ctor(类型类型,字符串默认命名空间)
在 Testdb.SqlServer.SqlUtility.XmlSerialize(Object oSerializableObject)
在 Testdb.SqlServer.StoredProcedures.clrSP_UserData_PermList (Guid gUserID, SqlChars& sqlCharList)

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

【问题讨论】:

  • 不确定 - 您说的是 SQL CLR - 您需要注意 SQL Server 2005 - 2008 R2 使用基于 .NET 2.0 的 SQL CLR,而自 SQL Server 2012,SQL CLR 基于.NET 4.0 .....

标签: sql-server .net-assembly sqlclr


【解决方案1】:

鉴于 System.Data.DataSetExtensions 不在 Supported .NET Framework Libraries 的列表中,我将假设您通过 CREATE ASSEMBLY 手动将其加载到 SQL Server 中(因此您必须启用TRUSTWORTHY)。自从您恢复了数据库后,其中的所有程序集都随之而来(大多数情况下,这是一件好事)。但是,在这种特殊情况下,它并没有太大帮助。问题是 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/框架版本 3.5 编译的库。您需要将数据库中现有的 System.Data.DataSetExtensions 替换为 4.0 版本。

  1. 我认为这不会起作用,因为 System.Data.DataSetExtensions 是链接到您的程序集的依赖项,但您可以尝试删除它并重新添加它。 p>

  2. 如果删除和重新创建不起作用,您可以尝试在其上执行ALTER ASSEMBLY,这是当前定义的就地替换。何时可以执行 ALTER ASSEMBLY 是有限制的,但我认为它没有任何 SQLCLR 公开方法这一事实可能允许它实际工作。

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

完成之后,交叉手指,祈祷,供品,揉幸运兔的脚,希望 a) System.Data.DataSetExtensions 没有变成混合模式的程序集 (在任何时间点,从 4.0 的初始版本到当前的 4.6.2 或任何最新的框架版本),并且 b)您没有也使用 System.ServiceModel,因为 它确实在那次 4.0 转换中从纯 MSIL 变为混合模式,因此从 SQL Server 2012 开始变得不可加载,因为 SQL Server 的 CLR 主机中的限制之一是只允许纯 MSIL 程序集。

【讨论】:

    猜你喜欢
    • 2023-03-26
    • 2018-09-03
    • 2020-08-17
    相关资源
    最近更新 更多