使用 Dapper 的 NextResult
NextResult with Dapper
我正在将 Dapper 与 ClickHouse 数据库一起使用 (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);
}
}
但是当检索到所有数据并且 SQL reader 变为空时,此代码抛出异常 ObjectDisposedException
。
我需要知道是否有办法知道我应该何时完成迭代?或者还有其他方法可以使用该数据库吗?
这是因为do/while无限循环。您只能为执行的语句数调用 read。
I need to know is there the way to know when I should finish iteration?
检查以确保 reader 在读取集合之前尚未被消耗
using (var gridReader = connection.QueryMultiple(sql)) {
while(!gridReader.IsConsumed) { //<-- query multiple until consumed
var list = gridReader.Read<T>().ToList();
... /* Do something with list */
}
}
我正在将 Dapper 与 ClickHouse 数据库一起使用 (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);
}
}
但是当检索到所有数据并且 SQL reader 变为空时,此代码抛出异常 ObjectDisposedException
。
我需要知道是否有办法知道我应该何时完成迭代?或者还有其他方法可以使用该数据库吗?
这是因为do/while无限循环。您只能为执行的语句数调用 read。
I need to know is there the way to know when I should finish iteration?
检查以确保 reader 在读取集合之前尚未被消耗
using (var gridReader = connection.QueryMultiple(sql)) {
while(!gridReader.IsConsumed) { //<-- query multiple until consumed
var list = gridReader.Read<T>().ToList();
... /* Do something with list */
}
}