我正在尝试 FSharp 数据提供程序,但针对使用 npgsql 的 Postgresql。我在第一线就失败了。
当我尝试创建 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
在上面的代码中,第一个注释行不起作用,而下面的代码使用相同的设置。这意味着问题仅与类型提供程序有关,而不是与连接恕我直言。
我是否需要做任何其他设置。
如果需要任何其他详细信息,请告诉我。
更新
在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 Server。
如果需要任何进一步的信息,请告诉我。