Преобразование SqlDataReader в список неизвестных типов из-за динамического запроса - PullRequest
1 голос
/ 06 декабря 2011

Друзья, У меня есть динамический 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, и я хочу создать список, тип которого содержит строку и целое число, а затем заполнить список строками результата.

Когда запрос меняется на , выберите отметки, тему, оценку из отметок, где studentid = 1432 , тогда я хочу создать список, тип которого содержит int, string, char, а затем заполнить список строками результата.

Есть ли способ сделать это?

PS Пользователь знает, как выбирать значения, если я возвращаю список, как описано выше, поскольку он создал запрос и знает, сколько столбцов ожидать.

1 Ответ

3 голосов
/ 06 декабря 2011

Если вызывающий будет знать тип, make будет универсальным методом и создаст T для строки ...

Или, поскольку dapper-dot-net уже делает это:

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

Если вызывающий также не может знать T, вы можете использовать ExpandoObject, чтобы заполнить List<dynamic>, приведя расширитель к IDictionary<string,object>, чтобы заполнить его парами ключ / значение.

Или, поскольку 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);
}
...