WPF PostgreSQL 11.1
Npgsql.PostgresException:'42P01:关系“ testme”不存在”
当尝试使用具有多个架构的PostgreSQL数据库时,我在App.config中定义了以下连接字符串。请注意,唯一的区别在于SearchPath:
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.min.js"></script>
<div id ="page">
<div class = "notification">NOTIFICATION</div>
<div id = "header">HEADER</div>
<div id="content"></div>
</div>
使用NuGet安装了Npgsql数据提供程序:运行时版本: v4.0.30319版本:4.0.4.0
在PostgreSQL的Phoenix模式中:
<system.data>
<DbProviderFactories>
<add name="Npgsql Data Provider" invariant="Npgsql" support="FF" description=".Net Framework Data Provider for Postgresql Server" type="Npgsql.NpgsqlFactory, Npgsql, Version=4.0.4.0, Culture=neutral" />
</DbProviderFactories>
</system.data>
<connectionStrings>
<clear />
<add name="localconnection" providerName="Npgsql" connectionString="Server=127.0.0.1;Port=5432;Database=chaos;User Id=postgres;Password=****;Searchpath=nova" />
<add name="phoenixconnection" providerName="Npgsql" connectionString="Server=127.0.0.1;Port=5432;Database=chaos;User Id=postgres;Password=****;SearchPath=phoenix;" />
</connectionStrings>
使用PgAdmin,显示testme表可以正常工作:
CREATE TABLE phoenix.testme
(
name text COLLATE pg_catalog."default" NOT NULL
)
WITH (
OIDS = FALSE
)
TABLESPACE pg_default;
ALTER TABLE phoenix.testme
OWNER to postgres;
我已经使用上述连接字符串配置了WCF服务。使用PetaPoco,我编写了以下脚本:
select * from phoenix.testme;
当我收到上述错误时,所有操作正常,直到执行“从testme中选择*”为止。注意:“ show search_path”中的ss正确返回“ phoenix”
我在做什么错?我如何使它工作?
最能帮助您吗?
答案 0 :(得分:0)
经过反复摸索,答案变得不言而喻。首先,我不得不重置SEARCH_PATH在数据库中。这没有帮助。然后我重建了POCO与PetaPoco并很快发现,不仅是新表,“TESTME”,没有创造,但也没有任何POCO的。所以,检查,在PetaPoco的Database.tt文件表明,它有错误的connectionStringName。改变的connectionStringName为“phoenixconnection”允许建设POCO的,但还是没有找到“TESTME”表。
然后,错误变得显而易见,如上所述,“ phoenixconnection”和“ localconnection”都指向同一端口。在以前的开发中,我使PostgreSQL v10.1与较新的PostgreSQL v11.1在同一端口上运行。显然,第一PostgreSQL的10.1被接收到连接(而不是较新的PostgreSQL V11.1)。
现在转到服务(services.msc)并关闭v10.1并运行Database.TT时出现错误: System.InvalidOperationException:序列包含多个匹配元素
显然,v10.1(我用于开发)只有一个模式,但是v11.1具有多个模式。我认为错误消息的意思是PetaPoco看到多个具有相同表名的表-即它没有区分模式。
因此,现在的问题得到解决。
显然,PetaPoco在生成其POCO时只能使用一种模式,但是在运行时将从WCF的App.Config中读取连接字符串以执行其查询等。(因此,在App.config中,数据库.TT驻留,将PetaPoco指向仅具有一个模式的“开发”数据库,但是在WCF环境中,将连接字符串指向具有多个模式的新数据库。连接字符串 IS 通过Npgsql运行时受尊重)。
如果PetaPoco可以在多模式环境中生成特定于模式的POCO,那就太好了,但是目前,我想它不能:(
附录注:原来,PostgreSQL的的给定实例可具有多个 数据库。因此,如果Npgsql的连接字符串特定于开发数据库(即仅具有一个架构的数据库),那么在开发期间,PetaPoco可以很好地创建POCO。这些POCO可以直接在WCF服务项目中使用,并上传到IIS网站。然后,可以将网站的App.config文件定向为将运行时数据库(同样在连接字符串中)用于已部署的数据库。一切正常! :)