1

我正在使用带有 ClickHouse 数据库的 Dapper ( https://clickhouse.yandex/ )。这是分布式的面向列的数据库。它工作得很好,但是查询结果可以分成很多块,所以我应该使用 NextResult 来检索所有数据。示例代码:

public static void ExecuteSQL(ClickHouseConnection connection, string sql)
{
    using (var reader = connection.CreateCommand(sql).ExecuteReader())
    {
        do
        {
            while (reader.Read())
            {
                        ...
            }
        }
        while (reader.NextResult());
    }
}

我正在尝试使用 Dapper。为了调用 NextResult 我应该使用QueryMultiple方法。我做了代码:

public static void ExecuteDapperQuery<T>(ClickHouseConnection connection, string sql)
{
    Dapper.DefaultTypeMap.MatchNamesWithUnderscores = true;
    using (var dapperQuery = connection.QueryMultiple(sql))
    {
        do
        {
            var list = dapperQuery.Read<T>().ToList();
            ... /* Do something with list */
        }
        while (true);
    }
}

ObjectDisposedException但是当检索到所有数据并且 SQL 读取器变为空时,此代码会引发异常。我需要知道有没有办法知道我应该何时完成迭代?或者还有其他方法可以使用该数据库吗?

4

1 回答 1

1

这是因为无限的 do/while 循环。您只能为执行的语句数调用 read。

我需要知道有没有办法知道我应该何时完成迭代?

在阅读套装之前检查以确保阅读器尚未被消耗

using (var gridReader = connection.QueryMultiple(sql)) {
    while(!gridReader.IsConsumed) { //<-- query multiple until consumed
        var list = gridReader.Read<T>().ToList();
        ... /* Do something with list */
    }
}
于 2017-08-22T10:17:12.793 回答