C# 如何在C和Npgsql中使用不带双引号的PostgreSQL表名

C# 如何在C和Npgsql中使用不带双引号的PostgreSQL表名,c#,postgresql,npgsql,C#,Postgresql,Npgsql,我正在尝试从带有Npgsql2库的PostgreSQL 10.5数据库中选择数据-我无法使用Npgsql3或Npgsql4,因为我需要最大限度地支持Windows XP.NET 4.0。 我使用以下代码: var builder = new NpgsqlConnectionStringBuilder(); //setting connection string variables here var connection = new NpgsqlConnection(builder.Tostrin

我正在尝试从带有Npgsql2库的PostgreSQL 10.5数据库中选择数据-我无法使用Npgsql3或Npgsql4,因为我需要最大限度地支持Windows XP.NET 4.0。 我使用以下代码:

var builder = new NpgsqlConnectionStringBuilder();
//setting connection string variables here
var connection = new NpgsqlConnection(builder.Tostring());
var query = "SELECT * FROM \"TableName\" ORDER BY \"ColumnName\"";
var adapter = new NpgsqlDataAdapter(query, connection);
var dataSet = new DataSet();

connection.Open();
adapter.Fill(dataSet);
如果我在查询中没有对TableName或ColumnName使用双引号,则会失败,并出现错误:

PostgreSQL错误:42P01:关系“TableName”不存在

用双引号就行了


那么,是否可以使用不带双引号的Npgsql呢?有什么标志吗?

如果没有双引号,PostgreSQL会将所有标识符折叠为小写。这是PostgreSQL行为,与Npgsql无关——后者只是在编写SQL时传递SQL。您可以切换到所有小写表名,在这种情况下,您不再需要引号。

TableName是表的实际名称,还是其他名称?您需要双引号使名称区分大小写。如果您的表名实际上是TableName,则需要双引号来保留大写字符,否则它将尝试读取名为TableName的表。如果数据库在您手中,您可以更改表名和列名,然后将所有表名和列名小写,则问题将得到解决。您可以使用select*from tablenameİ语句访问表tablename是表的实际名称。不幸的是,我无法更改数据库模式,所以看起来双引号是唯一的解决方案。谢谢大家。