dapper是否支持.net数据集

时间:2013-08-19 15:41:17

标签: dapper

在我看来,dapper.query对象有一个datareader,对于dapper.Execute有一个ExectureNonQuery对象。如果我错了,请纠正我。

我们可以将dapper用于返回多个表的数据集吗?

3 个答案:

答案 0 :(得分:6)

不,没有任何内置支持DataSet,主要是因为它似乎在很大程度上是多余的,但也因为这不是小巧的目标。但这并不意味着它不包含用于处理select多个结果的查询的API;见QueryMultiple

using (var multi = conn.QueryMultiple(sql, args))
{
    var ids = multi.Read<int>().ToList();
    var customers = multi.Read<Customer>().ToList();
    dynamic someOtherRow = multi.Read().Single();
    int qty = someOtherRow.Quantity, price = someOtherRow.Price;
}

请注意,此API仅是转发(由于IDataReader等的性质) - 基本上,每个Read / Read<T>等依次映射到下一个结果网格。

答案 1 :(得分:0)

我可能迟到了,但这就是我将IDataReader转换为DataSet的方式。当我们使用Dapper方法时,IDataReader返回一个ExecuteReaderAsync。可以在herehere中找到有关此添加项的更多信息。

这是我对此的尝试:

public async Task<DataSet> GetUserInformationOnUserId(int UserId)
{
    var storedprocedure = "usp_getUserInformation";
    var param = new DynamicParameters();
    param.Add("@userId", UserId);
    var list = await SqlMapper.ExecuteReaderAsync(_connectionFactory.GetEpaperDBConnection, storedprocedure, param, commandType: CommandType.StoredProcedure);
    var dataset = ConvertDataReaderToDataSet(list, 1);
    return dataset;
}

然后ConvertDataReaderToDataSet将接受IDataReader和结果中期望的DataTables数。我无法完全使其动态化(如果有人这样做了,那么很高兴看到他们的解决方案)。

public DataSet ConvertDataReaderToDataSet(IDataReader data, int datatableCount)
{
    DataSet ds = new DataSet();
    for (int i = 0; i < datatableCount; i++)
    {
        ds.Tables.Add("Table"+(i+1));
        ds.EnforceConstraints = false;
        ds.Tables[i].Load(data);
    }
    return ds;
}

如果您不知道数据表是否提前计数,则可以使用此方法将IReader转换为数据集:

public DataSet ConvertDataReaderToDataSet(IDataReader data)
{
    DataSet ds = new DataSet();
    int i = 0;
    while (!data.IsClosed)
    {
        ds.Tables.Add("Table" + (i + 1));
        ds.EnforceConstraints = false;
        ds.Tables[i].Load(data);
        i++;
    }                    
    return ds;
}

答案 2 :(得分:0)

Rahul,这个片段非常有用。

<块引用>
public DataSet ConvertDataReaderToDataSet(IDataReader data)
{
    DataSet ds = new DataSet();
    int i = 0;
    while (!data.IsClosed)
    {
        ds.Tables.Add("Table" + (i + 1));
        ds.EnforceConstraints = false;
        ds.Tables[i].Load(data);
        i++;
    }                    
    return ds;
}