我试图在使用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来显式指定参数类型。