当我尝试创建SqlDataConnection时,它会抛出一个错误,消息是连接字符串不正确。
“Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders”类型提供程序报告了一个错误:“不支持的关键字:'port:5432;database'”。
现在,我使用Servicestack.Ormlite测试连接字符串和数据。它基本上使用IdbConnection。因此,连接都是正确的。但我不知道为什么类型提供程序不起作用。
以下是代码。
//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的评论后,我尝试了两种方法。以下是带有Web配置的更新代码。
//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
这里是Web.config
<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数据提供程序。它可能没有被安装。
我仍然不明白为什么它正在搜索SQL Server。类型提供程序'Microsoft.FSharp.Data.TypeProviders.DesignTime.DataProviders'报告了一个错误:读取模式时出错。错误7001:该提供程序未返回ProviderManifestToken字符串。与SQL Server建立连接时出现了与网络相关或特定于实例的错误。无法找到服务器或无法访问。请验证实例名称是否正确,并确认SQL Server已配置为允许远程连接。(提供程序:命名管道提供程序,错误:40 - 无法打开到 SQL Server 的连接)找不到网络路径。
如果需要更多信息,请告诉我。
SqlDataConnection
依赖于 sqlmetal.exe 进行代码生成,据我所知它仅支持 SQL Server。 - kvbSqlEntityConnection
,因为实体框架支持多个数据库。我不知道如何进行配置,但你可以参考 https://dev59.com/_XM_5IYBdhLWcg3w02z8 了解有关使用实体框架与 PostgreSQL 的更多信息。 - kvbSqlEntityConnection
的可选Provider
参数。 - kvbSqlEntityConnection<ConnectionStringName="...", Provider="...">
。 - kvb