Dapper 在尝试使用 "QueryMultiple" 时给予 "Invalid attempt to call FieldCount when reader is closed."
Dapper giving "Invalid attempt to call FieldCount when reader is closed." when trying to use "QueryMultiple"
我有一个 Dapper.NET 的 QueryMultiple
方法的包装器方法。它成功地从具有 3 个查询的存储过程中获取数据,它们都是 SELECT
个查询。但是拿到数据后,我不能用Read
或ReadAsync
给class变量赋值。我在下面附上我的代码。
public Tuple<IEnumerable<T1>, IEnumerable<T2>, IEnumerable<T3>>
QueryMultiple<T1, T2, T3>()
{
try
{
var data = MultiQuery("[App].[USP_GetAllCategories]");
var category = data.Read<T1>();
var subcategory = data.Read<T2>();
var subSubcategory = data.Read<T3>();
return new Tuple<IEnumerable<T1>, IEnumerable<T2>, IEnumerable<T3>>(
category, subcategory, subSubcategory);
}
catch (Exception)
{
return null;
}
}
public SqlMapper.GridReader MultiQuery(string storedProcedureName)
{
using (var connection = LocalConnection())
{
try
{
return connection.QueryMultiple(
sql: storedProcedureName,
commandType: CommandType.StoredProcedure);
}
catch (Exception)
{
return null;
}
finally
{
CloseConnection(connection);
}
}
}
看看你的MultiQuery
方法。特别是,请查看 finally
块。现在考虑:在数据被消费之前调用了该块。基本上,不要那样做。
如果是我:
using (var connection = LocalConnection())
uaing (var data = conn.QueryMultiple("[App].[USP_GetAllCategories]",
command type: CommandType.StoredProcedure))
{
//... Consume
}
如果编写添加 command-type 的 QueryMultipleSP
扩展方法有帮助,那么可以这样做,但是...
我有一个 Dapper.NET 的 QueryMultiple
方法的包装器方法。它成功地从具有 3 个查询的存储过程中获取数据,它们都是 SELECT
个查询。但是拿到数据后,我不能用Read
或ReadAsync
给class变量赋值。我在下面附上我的代码。
public Tuple<IEnumerable<T1>, IEnumerable<T2>, IEnumerable<T3>>
QueryMultiple<T1, T2, T3>()
{
try
{
var data = MultiQuery("[App].[USP_GetAllCategories]");
var category = data.Read<T1>();
var subcategory = data.Read<T2>();
var subSubcategory = data.Read<T3>();
return new Tuple<IEnumerable<T1>, IEnumerable<T2>, IEnumerable<T3>>(
category, subcategory, subSubcategory);
}
catch (Exception)
{
return null;
}
}
public SqlMapper.GridReader MultiQuery(string storedProcedureName)
{
using (var connection = LocalConnection())
{
try
{
return connection.QueryMultiple(
sql: storedProcedureName,
commandType: CommandType.StoredProcedure);
}
catch (Exception)
{
return null;
}
finally
{
CloseConnection(connection);
}
}
}
看看你的MultiQuery
方法。特别是,请查看 finally
块。现在考虑:在数据被消费之前调用了该块。基本上,不要那样做。
如果是我:
using (var connection = LocalConnection())
uaing (var data = conn.QueryMultiple("[App].[USP_GetAllCategories]",
command type: CommandType.StoredProcedure))
{
//... Consume
}
如果编写添加 command-type 的 QueryMultipleSP
扩展方法有帮助,那么可以这样做,但是...