Npgsql 忘记了所有数据类型
Npgsql has forgotten all data types
我正在使用 Npgsql 连接到不安全的本地 CockroachDb 服务器,如下所示:
using (NpgsqlConnection connection = new NpgsqlConnection(@"Port=26257;Username=user;Database=thedata;Host=localhost")) {
connection.Open();
NpgsqlCommand command = new NpgsqlCommand("SELECT 1 AS records", connection);
command.CommandType = CommandType.Text;
using (NpgsqlDataReader reader = command.ExecuteReader()) {
while (reader.Read()) {
Console.WriteLine(reader["records"].GetType());
}
}
}
GetType() 失败并出现异常:
The field 'records' has a type currently unknown to Npgsql (OID 20). You can retrieve it as a string by marking it as unknown, please see the FAQ.
如果我遵循 FAQ 中的建议 (AllResultTypesAreUnknown=true),我可以获得一个字符串,但为什么不是一个 int?
昨天,这对我来说工作正常,但我无法弄清楚发生了什么变化或损坏,因此我无法设置或获取任何数据类型。我已经删除并重新创建了服务器,没有运气。重新安装了 C# 驱动程序,也不走运。这是一个简化的代码示例,上面发生在我的 'real' 代码中,具有参数化值和检索结果。
为了保护服务器,我创建了一个新用户,该用户对 table 查询具有 SELECT 和 INSERT 权限,但对数据库没有权限。在 re-walking 通过 CockroachDb C# primer 之后,我意识到示例的用户拥有完全的数据库权限,并凭直觉尝试了同样的操作。我猜驱动程序需要在某处访问架构 table 才能确定查询的数据类型(我们将忽略我提供的示例不需要的事实)。
GRANT SELECT ON DATABASE database TO user;
我正在使用 Npgsql 连接到不安全的本地 CockroachDb 服务器,如下所示:
using (NpgsqlConnection connection = new NpgsqlConnection(@"Port=26257;Username=user;Database=thedata;Host=localhost")) {
connection.Open();
NpgsqlCommand command = new NpgsqlCommand("SELECT 1 AS records", connection);
command.CommandType = CommandType.Text;
using (NpgsqlDataReader reader = command.ExecuteReader()) {
while (reader.Read()) {
Console.WriteLine(reader["records"].GetType());
}
}
}
GetType() 失败并出现异常:
The field 'records' has a type currently unknown to Npgsql (OID 20). You can retrieve it as a string by marking it as unknown, please see the FAQ.
如果我遵循 FAQ 中的建议 (AllResultTypesAreUnknown=true),我可以获得一个字符串,但为什么不是一个 int?
昨天,这对我来说工作正常,但我无法弄清楚发生了什么变化或损坏,因此我无法设置或获取任何数据类型。我已经删除并重新创建了服务器,没有运气。重新安装了 C# 驱动程序,也不走运。这是一个简化的代码示例,上面发生在我的 'real' 代码中,具有参数化值和检索结果。
为了保护服务器,我创建了一个新用户,该用户对 table 查询具有 SELECT 和 INSERT 权限,但对数据库没有权限。在 re-walking 通过 CockroachDb C# primer 之后,我意识到示例的用户拥有完全的数据库权限,并凭直觉尝试了同样的操作。我猜驱动程序需要在某处访问架构 table 才能确定查询的数据类型(我们将忽略我提供的示例不需要的事实)。
GRANT SELECT ON DATABASE database TO user;