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

Posted

技术标签:

【中文标题】将 app.config 中的连接字符串与 FSharp.Data.SqlClient 一起使用【英文标题】:Using connectionstring from app.config with FSharp.Data.SqlClient 【发布时间】:2017-03-14 20:06:16 【问题描述】:

我正在使用 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",但它给了我一个运行时错误,名称不受支持。

我似乎找不到任何文档来解释那里的内容。

更新

我发现了这个解决方法。 https://fsprojects.github.io/FSharp.Configuration/

如果您无论如何都必须提供连接字符串,我不明白ConnectionStringOrName 的目的。还有为什么你必须指定它两次。对我来说意义不大:(

【问题讨论】:

试试DefaultConnection,不带name= @FyodorSoikin 然后我得到了这个错误:Format of the initialization string does not conform to specification starting at index 0. 【参考方案1】:

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

Compile-time one,在您编辑代码和编译代码时使用。类型提供程序使用此连接或数据源来推断数据的架构 - 在 SQL 提供程序的情况下,这是用于检查所有列名是否存在等的数据库连接。

Run-time one 用于在将程序部署到某处后实际运行该程序。这是您从中读取实际数据的地方。

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

如果是 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 指定为特殊字符串的原因。

【讨论】:

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

以上是关于将 app.config 中的连接字符串与 FSharp.Data.SqlClient 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 运行时读取、写入和更新 app.config 文件中的连接字符串

DAL 中的 app.config 和 Web 应用程序中的 web.config

web.config与.dll中的app.config

加密 app.config 中的连接字符串

为 WinForms 应用程序加密 app.config 中的连接字符串

Winforms - 程序无法从 app.config 中找到连接字符串