我有一个 F# DLL(.NET Framework 4.5.1、F# 4.1、FSharp.Core 4.4.3.0)。唯一添加的 NuGet 引用是 FSharp.Data.SqlProvider 1.1.41。
代码只在一个文件中
module DB
open FSharp.Data.Sql
[<Literal>]
let private dbVendor = Common.DatabaseProviderTypes.MSSQLSERVER
构建没有错误
将SQL Server中构建的dll作为程序集导入
CREATE ASSEMBLY [Library2] FROM '<path>\Library2.dll' WITH PERMISSION_SET = UNSAFE
操作失败并出现错误
Assembly 'Library2' references assembly 'fsharp.core, version=4.3.1.0, culture=neutral, publickeytoken=b03f5f7f11d50a3a.', which is not present in the current database. SQL Server attempted to locate and automatically load the referenced assembly from the same location where referring assembly came from, but that operation has failed (reason: version, culture or public key mismatch). Please load the referenced assembly into the current database and retry your request
现在注释代码中的最后两行
//[<Literal>]
//let private dbVendor = Common.DatabaseProviderTypes.MSSQLSERVER
有了这个,SQL 程序集创建成功,程序集在 SQL Server 中正确创建
最后,如果我将项目降级到 F# 3.1 (FSharp.Core 4.3.1.0),那么在这两种情况下都没有错误
SQL 服务器 14.0.1000
Windows 10 专业版
请注意,项目 GitHub 存储库中已提出问题:Issue #541
问题
- 有没有人认为我做的有问题?
- 有没有人遇到过这样的问题并解决了?如果是,怎么做?
最佳答案
F# 不是原生支持的 SQLCLR 语言。我相信只有 C#、VB.NET 和 Visual C++ 是(当然,IL,如果你想直接编写它而不是使用愚蠢的编译器;)。
因此,如错误消息所述,您需要手动加载该 F# DLL,并将其标记为 UNSAFE
。
有关在 SQLCLR 中使用 F# 的更多详细信息,请参阅我的以下答案(也在 S.O. 上):
F# with sqlclr in a reasonably safe way and scripted assembly
关于sql-server - 将引用 FSharp.Data.SqlProvider 的 SQL CLR 程序集注册到 SQL Server 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50055163/