Использование строки подключения из app.config с FSharp.Data.SqlClient

Я использую http://fsprojects.github.io/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 если вы все равно должны предоставить строку подключения. Кроме того, почему вы должны указать это дважды. Имеет для меня очень мало смысла:(

1 ответ

Решение

При использовании поставщиков типов вам часто нужны два отдельных источника данных:

  • Время компиляции, которое используется при редактировании кода и компиляции кода. Поставщик типов использует это соединение или источник данных для вывода схемы данных - в случае с поставщиком SQL это соединение с базой данных, которое используется для проверки существования всех имен столбцов и т. Д.

  • Один во время выполнения используется, когда вы фактически запускаете программу после того, как она где-то развернута. Здесь вы будете читать фактические данные.

Причина, по которой вам нужно два, заключается в том, что источник данных во время выполнения может быть определен во время выполнения и может быть недоступен во время компиляции (у вас обычно есть доступ к базе данных dev, но не к рабочей базе данных). Соединение во время компиляции должно быть постоянным, чтобы провайдер мог использовать его (при компиляции вашего кода) без выполнения какой-либо части вашего кода.

В случае поставщика команд 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 как особая строка.

Другие вопросы по тегам