使用npgsql从模式中查询cittext列



我试图在使用npgsql 6.0.5的非公共模式中的表中使用简单的WHERE子句中的cittext列。我的(简化的)数据库设置是

create schema citest;
create table citest.testtable (
id serial primary key,
name public.citext
);
set search_path = citest,public;
insert into testtable (name) values ('test');

在。net 6控制台应用程序中运行以下c#代码只能找到"test"但不是"测试";(大写T)

class Program {
static async Task Main(string[] args) {
string connectionString = "Server=myserver;Port=5432;Username=user;Password=pass;Database=mydatabase;Search Path=citest,public;SSLMode=Require;Trust Server Certificate=true;";
await SelectQueryTest(connectionString, "test");
await SelectQueryTest(connectionString, "Test");
Console.WriteLine("DONE");
}
private static readonly string SelectQuery =
"select name from testtable where name = $1;";
static async Task SelectQueryTest(string connString, string text) {
await using var connection = new NpgsqlConnection(connString);
await connection.OpenAsync();
await using var cmd = new NpgsqlCommand(SelectQuery, connection) {
Parameters =
{
new() { Value = text }
}
};
await using var reader = await cmd.ExecuteReaderAsync();
if (await reader.ReadAsync()) {
var reply = reader.GetFieldValue<string>(0);
Console.WriteLine($"postgres query {text}: read {reply}");
} else {
Console.WriteLine($"postgres query {text}: read none");
}
}
}

使用psql执行相同的查询会得到预期的结果。

set search_path = citest,public;
select name from testtable where name = 'Test';
name
------
test
(1 row)

如果你能给我指出正确的方向,我会很感激的。

Npgsql显式地键入它发送的参数,当您发送字符串时,Npgsql推断text类型。所以上面的代码类似于这样写:

select name from testtable where name = $1::text

…这不会进行不区分大小写的匹配(两边都需要是citext)。

要解决这个问题,通过将NpgsqlDbType设置为Citext来显式指定参数类型。

相关内容

  • 没有找到相关文章

最新更新