将 dapper 与 .net 核心一起使用时,对象必须实现 IConvertible 异常
Object must implement IConvertible Exception, when using dapper with .net core
我在我的项目中使用 asp net core,并将 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实例。
执行语句时,出现以下错误:
Object must implement IConvertible.
上面的代码有没有问题
尝试使用下一个查询:
SELECT EXISTS(SELECT 1 FROM employee_master WHERE employee_id = @columnValue)
您的查询“SELECT * FROM ....
”return匹配数据库中的行;不是您期望的 bool
。 ExecuteScalar
将 return 第一行的第一列。不能保证 that 列始终是布尔值;基本上,您也不期望该列的值。
查询应该类似于 select exists(select 1 from...
,如 here 所述。
它将 return true
/false
然后你可以用 await _connection.ExecuteScalarAsync<bool>(......
.
处理
因此,新代码变为:
bool exists = await _connection.ExecuteScalarAsync<bool>("select exists(select 1 from....);
return exists;
或者(慢;不推荐),您应该将查询更改为 SELECT COUNT(*) FROM ...
以获取记录数。阅读有关优化的更多信息 here。
然后你可以将它转换为 bool
如下所示:
int count = await _connection.ExecuteScalarAsync<int>("SELECT COUNT(*) FROM..........);
bool exists = count == 0 ? false : true;
return exists;
我在我的项目中使用 asp net core,并将 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实例。
执行语句时,出现以下错误:
Object must implement IConvertible.
上面的代码有没有问题
尝试使用下一个查询:
SELECT EXISTS(SELECT 1 FROM employee_master WHERE employee_id = @columnValue)
您的查询“SELECT * FROM ....
”return匹配数据库中的行;不是您期望的 bool
。 ExecuteScalar
将 return 第一行的第一列。不能保证 that 列始终是布尔值;基本上,您也不期望该列的值。
查询应该类似于 select exists(select 1 from...
,如 here 所述。
它将 return true
/false
然后你可以用 await _connection.ExecuteScalarAsync<bool>(......
.
处理
因此,新代码变为:
bool exists = await _connection.ExecuteScalarAsync<bool>("select exists(select 1 from....);
return exists;
或者(慢;不推荐),您应该将查询更改为 SELECT COUNT(*) FROM ...
以获取记录数。阅读有关优化的更多信息 here。
然后你可以将它转换为 bool
如下所示:
int count = await _connection.ExecuteScalarAsync<int>("SELECT COUNT(*) FROM..........);
bool exists = count == 0 ? false : true;
return exists;