2011-06-11 10 views
57

क्या संग्रहित प्रोसेस के साथ Dapper.NET का उपयोग करने का कोई तरीका है जो एकाधिक परिणाम सेट लौटाता है?Dapper.NET और एकाधिक परिणाम सेट के साथ संग्रहित प्रो

मेरे मामले में, पहला परिणाम सेट एक ही पंक्ति के साथ एक पंक्ति है; यदि यह 0 है तो कॉल सफल रहा, और दूसरे परिणाम सेट में उस वास्तविक पंक्ति/डेटा के कॉलम होंगे। (और यदि यह शून्य नहीं था, तो एक त्रुटि हुई और कोई दूसरा परिणाम सेट प्रदान नहीं किया जाएगा)

Dapper.NET के साथ इसे संभालने का कोई मौका? अब तक, मैं कभी भी उस एकल 0 वापस प्राप्त कर रहा हूं - लेकिन कुछ भी नहीं।

अद्यतन: ठीक है, यह ठीक काम करता है - जब तक परिणाम सेट नहीं होता है।

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

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

अब, मैं अभी तक एक और आवश्यकता है: 2 एक इकाई है।

डैपर की बहु-मैपिंग (SQL सर्वर से दो पंक्तियों को एक अलग पंक्ति में विभाजित करने के लिए दो अलग-अलग इकाइयों में विभाजित) उस दूसरे परिणाम सेट के लिए अभी तक समर्थित नहीं प्रतीत होता है (कम से कम एक अधिभार प्रतीत नहीं होता है .Read<T> का जो बहु-मैपिंग को संभाल सकता है)।

मैं उस पंक्ति को दो इकाइयों में कैसे विभाजित कर सकता हूं?

उत्तर

58

क्या आपने QueryMultiple विधि की कोशिश की है? इसमें कहा गया है यह होना चाहिए:

बारी में एक आदेश है कि कई परिणाम सेट देता है निष्पादित, और पहुंचने के लिए हर

+6

इस उत्तर के लिए एक उदाहरण या अधिक विस्तार के साथ एक लिंक से लाभ होगा। –

94

QueryMultiple कई परिणाम सेट से निपटने की क्षमता का समर्थन करता है। हमने जो डिज़ाइन प्रतिबंध जोड़ा है वह पूरी तरह से ग्रिड रीडर के लिए बफरिंग अक्षम कर रहा था। इसका मतलब है कि संपूर्ण एपीआई स्ट्रीमिंग है।

सबसे सामान्य स्थिति में आप का उपयोग कर सकते हैं:

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 ओरेकल का समर्थन नहीं करता है, या इसके बजाय, ओरेकल QueryMultiple का समर्थन नहीं करता है। Http://stackoverflow.com/questions/1062569/batch-multiple-select-statements-when-calling-oracle-from-ado-net/1064692#1064692 –

+10

ओरेकल का उपयोग करके अटकने के लिए Commiserations देखें। –

+2

यह बहुत अच्छा है! क्या इस पर देखने के लिए कोई चेतावनी है? एक गोल यात्रा के रूप में भी डेटा पुनर्प्राप्त किया गया है? – scgough

5

एकाधिक परिणाम सेट। (सुरक्षा कारणों से, ओरेकल में एकाधिक प्रश्न नहीं हैं, मुझे लगता है)।

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

ओरेकल QueryMultiple या QueryMultipleAsync का समर्थन करता है –

संबंधित मुद्दे