WPF PostgreSQL 11.1
Npgsql.PostgresException:'42P01:关系"testme“不存在‘’
当尝试使用具有多个模式的PostgreSQL数据库时,我已经在App.config中定义了以下连接字符串。注意,唯一的区别是在SearchPath中:
<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>
Npgsql数据提供程序是使用NuGet:运行时版本: v4.0.30319版本: 4.0.4.0安装的
在PostgreSQL中,在凤凰模式中:
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;
使用PgAdmin,显示testme表没有问题:
select * from phoenix.testme;
我已经使用上面的连接字符串配置了WCF服务。使用PetaPoco,我编写了以下脚本:
public string SayHello()
{
string msg;
using (var db = new chaosDB("phoenixconnection"))
{
var m = db.ExecuteScalar<string>("select version()");
msg = string.Format("Hello from {0}", m);
m = db.ExecuteScalar<string>("select current_schema");
msg = string.Format("{0} Current Schema is {1}", msg, m);
var ss = db.ExecuteScalar<string>("show search_path");
var s = db.Fetch<string>("select * from testme"); <---THIS FAILS!
msg = string.Format("{0} I Am {1}", msg, m);
}
return msg;
}
当我收到上述错误时,所有操作都是正确的,直到执行"select * from testme“为止。注: ss从“显示search_path”返回正确的“凤凰”
我做错什么了?我怎么才能让这个起作用??
有什么帮助是最感谢的吗?
发布于 2019-01-31 20:02:23
绞尽脑汁之后,答案变得不言自明了。首先,我在数据库中重置了search_path。这没什么用。然后,我用PetaPoco重新构建了POCO,很快就发现,不仅新表"testme“没有创建,而且没有任何POCO表。所以,检查一下,PetaPoco中的Database.tt文件显示它的ConnectionStringName是错误的。将ConnectionStringName更改为"phoenixconnection“允许构建POCO,但再次找不到"testme”表。
然后,如前所述,错误变得显而易见,"phoenixconnection“和"localconnection”都指向同一个端口。从以前的开发开始,我让PostgreSQL v10.1运行在与更新的PostgreSQL v11.1相同的端口上。显然,第一个PostgreSQL v10.1正在接收连接(而不是更新的PostgreSQL v11.1)。
转到服务(services.msc)并关闭v10.1并运行Database.TT,现在出现了错误:services.msc序列包含多个匹配元素
显然,v10.1 (我用于开发)只有一个模式,但是v11.1有多个模式。我认为错误消息意味着PetaPoco看到了多个表名相同的表--也就是说,它没有区分模式。
所以,问题现在已经解决了。
显然,PetaPoco在生成其POCO时只能使用一个模式,但在运行时将从WCF的App.Config读取连接字符串以执行其查询等(因此,在Database.TT所在的App.config中,将PetaPoco指向只有一个模式的“开发”数据库,但在WCF环境中,将连接字符串指向具有多个模式的新数据库。当运行Npgsql时,连接字符串的的是受尊重的。
如果PetaPoco能够在多模式环境中生成特定于模式的POCO,那就太好了,但是现在,我想它不能:
增编注:事实证明,给定的PostgreSQL实例可以有多个数据库。因此,如果Npgsql的连接字符串特定于开发数据库--即只有一个模式的数据库--那么在开发期间,PetaPoco可以很好地创建POCO。这些POCO可以直接用于website项目并上传到IIS网站。然后,可以将网站的App.config文件定向到已部署数据库的运行时数据库(同样在连接字符串中)。一切都很好!)
https://stackoverflow.com/questions/54451646
复制相似问题