VS2013 c#windows窗体。 我正在学习Dapper,这是我的第一枪: 我有一个简单的课程:
public class R
{
public int RID { get; set; }
public int RType { get; set; }
public string CC { get; set; }
public string RI { get; set; }
.
.
.
}
private void _setR(string rID)
{
int r_ID = Convert.ToInt16(requestID);
MY_R = new R();
SqlConnection c = new SqlConnection(Connection string);
c.Open();
var v= c.Query<R>("select RID, RType, CC, RI, .,.,., " +
"from Db_View_R where RID=@r_ID",
new { @r_ID = r_ID }) ;
c.Close();
MY_R = (R)v ; <--------- Invalid cast error here
}
查询很简单:视图中的几列。只返回1行。不知道我在这里错过了什么。 提前致谢
答案 0 :(得分:2)
扩展方法Query<T>
返回IEnumerable<T>
。因此,您绝对无法将类型IEnumerable<T>
的值分配给T
类型的变量。你应该只从序列中选择一个项目:
MY_R = v.FirstOrDefault(); // or First, Single, SingleOrDefault
实际上,通过改进命名,您的代码应如下所示:
var sql = "SELECT RID, RType, CC, RI FROM Db_View_R where RID = @id";
using(var conn = new SqlConnection(ConnectionString))
{
MY_R = conn.Query<R>(sql, new { id = Convert.ToInt16(requestID) })
.FirstOrDefault();
}
我仍然不喜欢像R
这样的名字(它可能应该是Request
),但它已经更加可读和安全了(你应该在using
语句中包装连接用法)。
答案 1 :(得分:1)
使用SingleOrDefault()
var v= c.Query<R>("select RID, RType, CC, RI, .,.,., " +
"from Db_View_R where RID=@r_ID",
new { @r_ID = r_ID }).SingleOrDefault();