postgresql 对象必须实现IConvertible Exception,网心

w3nuxt5m  于 2023-04-29  发布在  PostgreSQL
关注(0)|答案(2)|浏览(145)

我在我的项目中使用ASP NET核心,使用Dapper ORM和PostgreSQL作为数据库。我想检查数据库中是否存在具有特定UUID(C#中的GUID)值的用户。下面是我的代码检查相同:

public async Task<bool> DoesRecordExistAsync(Guid columnValue)
{

    bool doesRecordExist;

    doesRecordExist = await _connection.ExecuteScalarAsync<bool>("SELECT * FROM employee_master WHERE employee_id = @columnValue;", new { columnValue });

    return doesRecordExist;
}

注意:_connection是IDbconnection示例。
在执行该语句时,我得到以下错误:
对象必须实现IConvertible。
上面的代码有什么问题吗?

blmhpbnm

blmhpbnm1#

您的查询“SELECT * FROM ....“从数据库返回匹配的;不是你所期待的boolExecuteScalar将返回第一行的第一列。不能保证 that 列总是布尔值;基本上,你也不需要该列的值。
查询应该是类似于select exists(select 1 from...的内容,正如here所解释的那样。
它将返回true/false,然后您可以使用await _connection.ExecuteScalarAsync<bool>(......进行处理。
所以,新代码变成:

bool exists = await _connection.ExecuteScalarAsync<bool>("select exists(select 1 from....");
return exists;

或者(slow;不推荐),您应该将查询更改为SELECT COUNT(*) FROM ...以获取记录计数。阅读更多关于优化here
然后你可以将其转换为bool,如下所示:

int count = await _connection.ExecuteScalarAsync<int>("SELECT COUNT(*) FROM..........");
bool exists = count == 0 ? false : true;
return exists;
lbsnaicq

lbsnaicq2#

尝试使用下一个查询:

SELECT EXISTS(SELECT 1 FROM employee_master WHERE employee_id = @columnValue)

相关问题