【发布时间】:2016-01-04 05:04:30
【问题描述】:
我有一个 Dapper.NET 的 QueryMultiple 方法的包装方法。它成功地从一个存储过程中获取数据,该存储过程有 3 个查询,它们都是SELECT 查询。但是获取数据后,我无法使用Read 或ReadAsync 将数据分配给类变量。我在下面附上我的代码。
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);
}
}
}
【问题讨论】:
-
您在调用
Read之前就已经处理了连接。我不确定 dapper 是否会立即加载数据,但无论如何代码看起来都是错误的.. 没有一个很好的理由来拥有一个简单地为您包装using的方法。只需将using块放入QueryMultiple。 -
@Rob 供参考:不,它没有(至少在这种情况下也没有);它基本上包装了一个开放的
IDataReader -
@Rob 我认为在处理连接后,我仍然可以使用
GridReader从中读取数据。但正如你所看到的,它似乎不起作用。我创建了MultiQuery,这样其他开发人员就不需要知道如何查询,只需使用GridReader来获取数据。 -
@haider_kazal 无法保证读者在关闭连接后仍然有效;它是一个开放阅读器——我们实际上还没有从 TDS 流中消费任何数据
-
好的...谢谢@MarcGravell
标签: c# asp.net-web-api2 dapper