Использование connectionstring из приложения.конфиг с помощью FSharp.Данные.Поставщики sqlclient


Я использую FSharp.Данные.SqlClient и пытается переместить мою строку connectionString из [<Literal>] в приложение.конфиг.

Мое приложение.конфигурация выглядит следующим образом

<?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 из fixnig проблема, которую я нашел этот обходной путь. https://fsprojects.github.io/FSharp.Configuration/

Я не понимаю цели ConnectionStringOrName, Если вам все равно нужно предоставить строку подключения. Также, почему вы должны указать его дважды. Для меня это имеет очень мало смысла : (

1 7
f#

1 ответ:

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

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

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

Причина, по которой вам нужны два, заключается в том, что источник данных времени выполнения может быть определен во время выполнения и он может быть недоступен во время компиляции (обычно у вас есть доступ к базе данных 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 в качестве специальной строки.