【发布时间】:2013-07-25 02:40:07
【问题描述】:
我尝试使用 FSharp 数据提供程序,但使用 npgsql 对抗 Postgresql。我在第一线就失败了。
当我尝试创建 SqlDataConnection 时,它会抛出错误消息,连接字符串不正确。
类型提供者 'Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders' 报错:Keyword not supported: 'port:5432;database'。
现在,我使用 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 服务器。服务器未找到或无法访问。核实 实例名称正确且 SQL Server 配置为 允许远程连接。 (提供者:命名管道提供者,错误:40 - 无法打开到 SQL Server 的连接)网络路径不是 找到了
我还是不明白为什么要搜索 SQL server。
如果需要任何进一步的信息,请告诉我。
【问题讨论】:
-
您拥有
Port:5432似乎很奇怪,但所有其他值都采用key=value的形式 -
SqlDataConnection的代码生成依赖于sqlmetal.exe,据我所知仅支持 SQL Server。 -
您可以尝试改用
SqlEntityConnection,因为实体框架确实支持多个数据库。我不知道如何配置它的细节,但另请参阅stackoverflow.com/questions/1211475/entity-framework-postgresql 了解有关将 PostgreSQL 与实体框架一起使用的更多信息。 -
我认为你可能需要设置
SqlEntityConnection的可选Provider参数除了正确设置连接字符串。 -
即
SqlEntityConnection<ConnectionStringName="...", Provider="...">
标签: postgresql f# npgsql type-providers f#-3.0