Я пробовал поставщика данных FSharp, но против Postgresql, используя npgsql. И я вылетел на самой первой строчке.
Когда я пытаюсь создать SqlDataConnection, он выдает ошибку с сообщением, что строка подключения неверна.
Поставщик типа «Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders» сообщил об ошибке: ключевое слово не поддерживается: «порт: 5432; база данных».
Теперь я проверяю строку подключения, а также данные с помощью Servicestack.Ormlite. Это в основном использует IdbConnection. Итак, с подключением все в порядке. Но я не знаю, почему не работает Type Provider.
Вот код.
//type dbSchema = SqlDataConnection<ConnectionString = "Server=localhost;Port=5432; Database=TestDB;User Id=postgres;Password=g00gle*92;" >
[<CLIMutable>]
type Person =
{ ID : int;
FirstName : string;
LastName : string }
[<EntryPoint>]
let main args =
let dbFactory =
OrmLiteConnectionFactory
(
"Server=localhost;Port=5432; Database=TestDB;User Id=postgres;Password=*****;",
PostgreSqlDialect.Provider)
use dbConnection = dbFactory.OpenDbConnection()
Console.WriteLine dbConnection.State
let persons = dbConnection.Select<Person>()
persons.ForEach(fun p -> Console.WriteLine p.FirstName)
Console.Read() |> ignore
0
В приведенном выше коде первая прокомментированная строка не работает, в то время как с теми же настройками ниже работает код. Это означает, что проблема связана только с поставщиком типов, а не с соединениями IMHO.
Нужно ли мне делать какие-то другие настройки.
Пожалуйста, дайте мне знать, если требуются какие-либо другие подробности.
ОБНОВЛЕНИЕ
После комментария kvb я попробовал оба. Вот обновленный код с веб-конфигурацией.
//type dbSchema = SqlEntityConnection<ConnectionStringName = "TestDB", Provider="Npgsql">
type dbSchema = SqlEntityConnection< ConnectionStringName="TestDB" >
[<CLIMutable>]
type Person =
{ ID : int;
FirstName : string;
LastName : string }
[<EntryPoint>]
let main args =
let dbFactory =
OrmLiteConnectionFactory
(
"Server=localhost;Port=5432; Database=TestDB;User Id=postgres;Password=*******;",
PostgreSqlDialect.Provider)
use dbConnection = dbFactory.OpenDbConnection()
Console.WriteLine dbConnection.State
let persons = dbConnection.Select<Person>()
persons.ForEach(fun p -> Console.WriteLine p.FirstName)
Console.Read() |> ignore
0
А вот и веб-конфиг
<system.data>
<DbProviderFactories>
<add name="Npgsql Data Provider"
invariant="Npgsql"
description="Data Provider for PostgreSQL"
type="Npgsql.NpgsqlFactory, Npgsql" />
</DbProviderFactories>
</system.data>
<connectionStrings>
<add name="TestDB"
connectionString="Server=localhost:5432; Database=TestDB;User Id=postgres;Password=******;"
providerName="Npgsql" />
</connectionStrings>
а вот и сборка в appconfig. Я не думаю, что это будет в GAC, как я добавил через nuget
<dependentAssembly>
<assemblyIdentity name="Npgsql" publicKeyToken="5d8b90d52f46fda7" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.0.12.0" newVersion="2.0.12.0" />
</dependentAssembly>
Выше оба комментария прокомментированы, а другой, без которого не комментируется, оба не работают с разными ошибками. Первый выходит из строя с ошибкой
Поставщик типа Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders сообщил об ошибке: Ошибка чтения схемы. ошибка 7001: указанный поставщик хранилища «Npgsql» не может быть найден в конфигурации или «Npgsql» недействителен. Невозможно найти запрошенный поставщик данных .Net Framework. Может не быть установлен.
а второй - с этой ошибкой
Поставщик типа Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders сообщил об ошибке: Ошибка чтения схемы. ошибка 7001: поставщик не вернул строку ProviderManifestToken. При установлении соединения с SQL Server произошла ошибка, связанная с сетью или конкретным экземпляром. Сервер не найден или не был доступен. Убедитесь, что имя экземпляра правильное и что SQL Server настроен на разрешение удаленных подключений. (поставщик: поставщик именованных каналов, ошибка: 40 - не удалось открыть соединение с SQL Server) Сетевой путь не найден
Я до сих пор не понимаю, зачем он ищет SQL-сервер.
Пожалуйста, дайте мне знать, если потребуется дополнительная информация.
Port:5432
, но все остальные значения находятся в формеkey=value
- person John Palmer   schedule 25.07.2013SqlDataConnection
полагается на sqlmetal.exe для своего кодогенератора, который поддерживает только SQL Server, насколько мне известно. - person kvb   schedule 25.07.2013SqlEntityConnection
, поскольку Entity Framework поддерживает несколько баз данных. Я не знаю, как его настроить, но см. Также stackoverflow.com / questions / 1211475 / entity-framework-postgresql для получения дополнительной информации об использовании PostgreSQL с Entity Framework. - person kvb   schedule 25.07.2013Provider
на имя класса поставщика Postgres. Например. для SQL Server это"System.Data.SqlClient"
, но соответствующий провайдер Postgres, вероятно, будет зависеть от того, какую библиотеку вы используете. - person kvb   schedule 25.07.2013Provider
в _2 _ в дополнение к правильной настройке строки подключения. - person kvb   schedule 26.07.2013SqlEntityConnection<ConnectionStringName="...", Provider="...">
- person kvb   schedule 26.07.2013"System.Data.SqlClient"
, если не указано иное. Можете ли вы опубликовать фактическую ошибку, возникающую при попытке указать"Npgsql"
провайдера? - person kvb   schedule 26.07.2013Npgsql
сборка в GAC? Что произойдет, если вы укажете полное имя сборки в разделеtype
(включая открытый ключ и т. Д.)? - person kvb   schedule 26.07.2013