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