2012-06-22 159 views
3

您好,我正在努力與Dapper握手。從單個查詢Dapper多個結果

我的情況是我想從查詢拉兩個值到兩個單獨的字符串。林不知道如果我要對這個正確的方法,但是這是我在做什麼:

string sql = @"Select type, name 
       FROM ZipData 
       WHERE Zip = @zip"; 

using (var multi = conn.QueryMultiple(sql, new { zip = zip })) 
{ 
    string result = multi.Read<string>().SingleOrDefault();   
} 

,我越來越無法訪問已釋放的對象。對象名稱:'GridReader'。當試圖讀取第二個字符串。事情是它獲得第一個正確的值,並在閱讀器中的字段都是我試圖獲得的。我確定我濫用API。

我在這裏做錯了什麼?我用google搜索了一下,但可以找到一個具體的例子。

+0

您的兩個值代表SELECT語句中的兩列嗎?或兩個*行*兩個*分開的* SELECT語句? (更好的是,只是告訴我們你的SQL) –

+0

他們都在那裏,我會添加我的SQL。 – gdp

回答

9

您錯誤使用QueryMultiple。這是爲返回多個結果集的複合SQL語句定義的。喜歡的東西:

SELECT Foo FROM MyTable; 
SELECT Bar FROM MyOtherTable; 

在另一方面,你正試圖從一個結果集得到兩個不同的,所以你應該只使用正常Query方法:

var result = conn.Query(sql, new { zip = zip }).Single(); 
var type = result.type; 
var name = result.name; 

Query返回一個枚舉(因爲通常一個查詢可以返回多行)。看起來你只需要一行,但是,所以我們在末尾調用.Single以獲取該行。在那裏,退貨類型爲dynamic,因此您可以簡單引用SELECT聲明中列的暗示性內容:typename

+0

我猜我是在濫用它。謝謝你的快速回答:)動態返回類型很酷。 – gdp

+0

在定義'result'時,你不需要使用'dynamic'關鍵字嗎?如'dynamic result = conn.Query(sql,new {zip = zip})。Single();' – webworm

+0

@webworm no,[方法的簽名](https://github.com/StackExchange/dapper- dot-net/blob/master/Dapper/SqlMapper.cs#L615)爲'public static IEnumerable Query(...)',所以每一行都已經聲明爲'dynamic'。 –

相關問題