使用app.config中的连接字符串与FSharp.Data.SqlClient一起使用

8
我是使用 FSharp.Data.SqlClient,并尝试将我的连接字符串从 [<Literal>] 移动到 app.config。
我的 app.config 如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Test;Integrated Security=True" providerName="System.Data.SqlClient"/>
  </connectionStrings>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" />
    </startup>
</configuration>

我的 SqlCommandProvider 如下所示,根据 http://fsprojects.github.io/FSharp.Data.SqlClient/configuration%20and%20input.html 应该是正确的。

new SqlCommandProvider<"SELECT ...", 
       ConnectionStringOrName = "name=DefaultConnection", 
       SingleRow = true, 
       AllParametersOptional = true>(??????)

现在的问题是,最后一个部分要填写什么??????
我尝试了"name=DefaultConnection"但是它给出一个运行时错误,因为名称不受支持。
我似乎找不到任何解释应该填什么的文档。
更新
与其修复问题,我发现了这个解决方法。 https://fsprojects.github.io/FSharp.Configuration/ 如果您必须提供连接字符串,我不明白ConnectionStringOrName 的目的。而且为什么你必须指定两次,我感到很困惑:(

尝试使用DefaultConnection,而不需要使用name= - Fyodor Soikin
1
@FyodorSoikin 然后我得到了这个错误:初始化字符串的格式不符合从索引0开始的规范。 - Snæbjørn
1个回答

8
使用类型提供程序时,通常需要两个不同的数据源:
  • 编译时数据源用于在编辑和编译代码时使用。类型提供程序使用此连接或数据源来推断数据架构-例如在 SQL 提供程序中,这是与数据库的连接,用于检查所有列名是否存在等。

  • 运行时数据源用于实际运行程序之前。在此处,您将从实际数据中读取数据。

为什么需要两个数据源?因为运行时数据源可能在运行时确定,并且在编译时可能无法访问(通常可以访问开发数据库,但无法访问生产数据库)。编译时连接需要是一个常量,以便提供程序可以使用它(在编译代码时)而不运行任何部分的代码。

在 SQL 命令提供程序的情况下:

type SelectCmd = SqlCommandProvider<"SELECT ...", 
   ConnectionStringOrName = "name=DefaultConnection", 
   SingleRow = true, 
   AllParametersOptional = true>

let cmd = new SelectCmd(??????)
  • "name=DefaultConnection"告诉提供程序在编译时使用app.config密钥
  • ?????是您需要指定运行时连接字符串的位置

要从app.config中读取连接字符串,您可以使用标准的.NET方法,例如使用ConfigurationManager:

open System.Configuration

let conn = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
let cmd = new SelectCmd(conn)

如果将连接字符串传递给SqlCommandProvider,类似这样的方法是行不通的,因为它需要运行一些代码来读取字符串,而这只有在运行时才可能实现。这就是为什么SQL命令提供程序有一个方便的选项,可以指定name=DefaultConnection作为特殊字符串。


1
当我尝试使用上述代码获取连接字符串时,我收到错误消息“此值不是函数,无法应用”。我已经引用了System.Configuration。我错过了什么? - user1206480
1
在F#中,该行应为System.Configuration.ConfigurationManager.ConnectionStrings.["DefaultConnection"]。请注意方括号前的点号。 - Gunner
只是好奇,当应用程序在生产环境中运行时,是否会有任何性能损失?提供者是否会再次读取数据库结构,还是已经存储在某个地方? - boggy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接