2012-06-22 164 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'。 –

相关问题