下一个结果

btqmn9zl  于 2021-07-15  发布在  ClickHouse
关注(0)|答案(1)|浏览(458)

我正在使用与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());
    }
}

我试着用整洁的。为了调用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 reader变为空时。我需要知道有没有办法知道我应该什么时候完成迭代?或者有没有其他方法来处理这个数据库?

uqxowvwt

uqxowvwt1#

这是因为无限的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 */
    }
}

相关问题