Использование строки подключения из 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
как особая строка.