【问题标题】:Convert SqlDataReader to a List of unknown types because of dynamic query由于动态查询,将 SqlDataReader 转换为未知类型列表
【发布时间】:2011-12-06 09:18:11
【问题描述】:

朋友们, 我有一个动态 sql 查询,我想执行并返回一个列表。 从我在 goole 上的大部分互联网搜索中,我发现必须知道列表的类型才能将 sqldatareader 转换为列表。 当我不知道将执行什么查询时,我该怎么做。

Execute(String query)
{
  SqlConnection con=new SqlConnection(connection);//connection from elsewhere
  SqlCommand cmd = new SqlCommand(query);
  cmd.connection=con;
  con.Open();
  SqlDataReader result=cmd.ExecuteReader();
  //How to convert result to a list when i do not know the table structure 
} 

现在我想将结果转换为列表。 但是我不知道查询工作的表的详细信息。查询可能会有所不同,它可以查询任何表。 因此,在这些条件下,我如何将结果转换为列表。有可能吗?

这给我留下了一个简单的问题,如果我不知道表格的详细信息,那么列表的条目将是什么,或者它将是什么的列表?

为了回答这个问题,我问自己另一个问题,是否有可能有一个列表,其中每个列表条目将对应于 SqlDataReader 结果的一行?

所以我可以使用 List x =result.Select().ToList(),但我也不想使用它。

我希望列表的每个条目映射到结果的每一行,同时由构成一行的原子数据类型组成。

例如从学生中选择学生姓名、学生编号; 这将返回一个 SqlDataReader 结果,我想构造一个类型包含字符串和 int 的列表,然后用结果的行填充列表。

当查询变为select scores,subject,grade from tags where studentid=1432时,我想构造一个类型包含int,string,char的列表,然后用结果的行。

有办法吗?

PS 如果我返回上面详述的列表,用户知道如何选择值,因为他创建了查询并且知道预期有多少列。

【问题讨论】:

  • 你不能使用 SqlTableAdapter 吗?您将获得 DataRow 的集合,以结果的架构为准

标签: .net list sqldatareader


【解决方案1】:

如果调用者知道类型,make是一个泛型方法,并为每行创建一个T...

或者,因为 dapper-dot-net 已经这样做了:

var list = connection.Query<T>(command [, args]).ToList();

如果调用者也不知道 T,您可以使用 ExpandoObject 填充 List&lt;dynamic&gt;,将 expando 转换为 IDictionary&lt;string,object&gt; 以使用键/值对填充它。

或者,因为 dapper-dot-net 已经这样做了:

var list = connection.Query(command [, args]).ToList();

然后调用者可以使用:

foreach(var item in list) {
    Console.WriteList("{0}, {1}, {2}", item.marks, item.subject, item.grade);
}

【讨论】:

  • 格拉维尔,超级就是这个词!非常感谢,这对实现我想要的非常有帮助。我今天还学到了一些新东西,Dapper dot net 和 ExpandoObject。
猜你喜欢
  • 1970-01-01
  • 2011-12-29
  • 1970-01-01
  • 2016-11-06
  • 1970-01-01
  • 2018-10-01
  • 1970-01-01
  • 2013-01-27
  • 1970-01-01
相关资源
最近更新 更多