2011-06-11 88 views
57

是否有任何方式使用Dapper.NET存儲過程返回多個結果集?Dapper.NET和存儲過程與多個結果集

在我的情況下,第一個結果集是單列單列;如果是0那麼調用成功,第二個結果集將包含實際的行/列數據。 (如果它不爲零,則會發生錯誤,並且不會提供第二個結果集)

有沒有機會使用Dapper.NET處理此問題?到目前爲止,我只能找回那個單一的0 - 但僅此而已。

更新:好吧,它工作正常 - 只要結果集沒有。 2是一個單一的實體:

Dapper.SqlMapper.GridReader reader = 
    _conn.QueryMultiple("sprocname", dynParams, 
    commandType: CommandType.StoredProcedure); 

int status = reader.Read<int>().FirstOrDefault(); 
MyEntityType resultObj = reader.Read<MyEntityType>().FirstOrDefault(); 

現在,我有又一要求。

對於第二個結果集,Dapper的多重映射(將從SQL Server返回的單個行拆分爲兩個單獨的實體)似乎尚未得到支持(至少似乎沒有過載可以處理多重映射的.Read<T>)。

如何將該行拆分爲兩個實體?

回答

58

您是否試過QueryMultiple方法?它說,它應該:

依次執行返回 多個結果集的命令,並訪問每個

+6

這個答案將來自示例性的或更詳細的鏈接中受益。 – 2017-11-13 21:18:26

94

QueryMultiple支持處理多個結果集的能力。我們添加的唯一設計限制是完全禁用網格讀取器的緩衝。這意味着整個API是

在最簡單的情況下,你可以使用:

var grid = connection.QueryMultiple("select 1 select 2"); 
grid.Read<int>().First().IsEqualTo(1); 
grid.Read<int>().First().IsEqualTo(2); 

在較爲複雜的情況下,你可以做瘋狂的事情是這樣的:

var p = new DynamicParameters(); 
p.Add("a", 11); 
p.Add("r", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue); 

connection.Execute(@"create proC#spEcho 
@a int 
as 
begin 

select @a Id, 'ping' Name, 1 Id, 'pong1' Name 
select @a Id, 'ping' Name, 2 Id, 'pong2' Name 
return @a 
end"); 

var grid = connection.QueryMultiple("#spEcho", p, 
            commandType: CommandType.StoredProcedure); 

var result1 = grid.Read<dynamic, dynamic, Tuple<dynamic, dynamic>>(
        (a, b) => Tuple.Create((object)a, (object)b)).ToList(); 
var result2 = grid.Read<dynamic, dynamic, Tuple<dynamic, dynamic>>(
        (a, b) => Tuple.Create((object)a, (object)b)).ToList(); 

((int)(result1[0].Item1.Id)).IsEqualTo(11); 
((int)(result1[0].Item2.Id)).IsEqualTo(1); 

((int)(result2[0].Item1.Id)).IsEqualTo(11); 
((int)(result2[0].Item2.Id)).IsEqualTo(2); 

p.Get<int>("r").IsEqualTo(11); 
+20

對未來讀者的注意:QueryMultiple不支持Oracle,或者說Oracle不支持QueryMultiple。查看http://stackoverflow.com/questions/1062569/batch-multiple-select-statements-when-calling-oracle-from-ado-net/1064692#1064692 – 2014-02-13 16:47:06

+10

Commiserations因使用Oracle而陷入困境。 – 2016-04-06 07:28:20

+2

這太棒了!有沒有需要注意的事項?同樣是一次往返檢索的數據? – scgough 2016-10-21 12:08:54

5

多個結果集。 (由於安全原因,我認爲Oracle沒有查詢倍數)。

var reader = conn.QueryMultiple("ProductSearch", param: new { CategoryID = 1, SubCategoryID = "", PageNumber = 1 }, commandType: CommandType.StoredProcedure); 
var CategoryOneList = reader.Read<CategoryOne>().ToList(); 
var CategoryTwoList = reader.Read<CategoryTwo>().ToList(); 

存儲過程:

CREATE PROCEDURE [dbo].[ProductSearch] 
    @CategoryID as varchar(20), 
    @SubCategoryID as varchar(20), 
    @PageNumber as varchar(20) 
AS 
BEGIN 
    SELECT * FROM ProductTbl 
    SELECT * FROM ProductTbl 
END 
+1

Oracle不支持QueryMultiple或QueryMultipleAsync – 2017-08-02 18:56:23

相關問題