【问题标题】:Object must implement IConvertible Exception, when using dapper with .net core将 dapper 与 .net 核心一起使用时,对象必须实现 IConvertible Exception
【发布时间】:2020-03-21 20:40:43
【问题描述】:

我在我的项目中使用 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 实例。

执行语句时,出现以下错误:

对象必须实现 IConvertible。

上面的代码有什么问题吗。

【问题讨论】:

  • 您为什么认为查询可以转换为bool?我假设您想改为使用SELECT COUNT(*)... 并将其转换为int。如果 int 值大于零,则返回true
  • ExecuteScalarAsync() 将选择一个值。如果转换后的类型指定为 bool,则返回 bool 值取决于该记录是否存在。与 LINQ 中的 Any() 相同。
  • 你希望 Dapper 如何将整个记录转换为 bool
  • 不。 ExecuteScalar(及其异步变体)将选择第一行的第一列。这种类型可能会有所不同。一般不要使用SELECT *,绝对不要与ExecuteScalar结合使用。
  • @DavidG 参考来自这个答案:stackoverflow.com/questions/39006512/…

标签: c# postgresql asp.net-core dapper


【解决方案1】:

您的查询“SELECT * FROM ....”正在从数据库返回匹配的;不是您期望的boolExecuteScalar 将返回第一行的第一列。不能保证 that 列始终是布尔值;基本上,您也不期望该列的价值。

查询应该类似于select exists(select 1 from... 解释here
它将返回true/false,然后您可以使用await _connection.ExecuteScalarAsync&lt;bool&gt;(...... 处理它。
所以,新的代码变成了:

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;

【讨论】:

  • 这个怎么样:bool exists = await _connection.ExecuteScalarAsync("select count(1) from .."); ? @AmitJoshi
  • @Sunny: COUNT(1) 不计算单行,它计算常量1 在结果集中出现的次数(即每行一次)。它等同于COUNT(42)COUNT(*),尽管一些非常幼稚的数据库引擎可能会选择以不同的方式实现它们(例如,在指定COUNT(1) 时不读取实际列,即使COUNT(*) 也不需要这样做) .
【解决方案2】:

尝试使用下一个查询:

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

【讨论】:

    猜你喜欢
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    • 2019-01-29
    相关资源
    最近更新 更多