使用app.config中的connectionstring和FSharp.Data.SqlClient

时间:2016-11-01 16:23:55

标签: f# f#-data fsharp.data.sqlclient

我正在使用FSharp.Data.SqlClient并尝试将我的connectionString从[<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"但是它给了我一个运行时错误,名称不受支持。

我似乎找不到任何文件来解释那里发生了什么。

更新

Instaed of fixnig我找到了这个解决方法的问题。 https://fsprojects.github.io/FSharp.Configuration/

如果必须提供连接字符串,我不会得到ConnectionStringOrName的目的。另外你为什么要指定它两次。对我来说没什么意义:(

1 个答案:

答案 0 :(得分:7)

使用类型提供程序时,通常需要两个单独的数据源:

  • 在编辑代码和编译代码时使用的编译时间。类型提供程序使用此连接或数据源来推断数据的模式 - 在SQL提供程序的情况下,这是与用于检查所有列名称是否存在等的数据库的连接。

  • 在某个地方部署程序后实际运行程序时会使用运行时一。您可以在这里阅读实际数据。

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

对于SQL命令提供程序:

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

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

要从app.config读取连接字符串,您可以使用标准.NET方法like using ConfigurationManager

open System.Configuration

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

将连接字符串传递给SqlCommandProvider时,这样的东西不起作用,因为这需要运行一些代码来读取字符串,而这只能在运行时使用。这就是SQL命令提供程序有一个方便的选项,可以将name=DefaultConnection指定为特殊字符串。