Я использую примерно такой код:
using (SqlConnection sqlConn = new SqlConnection(CachedStorage.ConnectionString))
{
sqlConn.Open();
SqlCommand cmd = new SqlCommand("exec barometerreport", sqlConn);
SqlDataReader reader = cmd.ExecuteReader();
List<Barometer> list = new List<Barometer>();
while (reader.Read())
{
Barometer rec = new Barometer();
rec.id = reader.GetInt16(reader.GetOrdinal("id"));
rec.ticker = reader.GetString(reader.GetOrdinal("ticker"));
rec.tickerName = reader.GetString(reader.GetOrdinal("tickerName"));
rec.price = reader.GetDecimal(reader.GetOrdinal("opn"));
rec.value = reader.GetDecimal(reader.GetOrdinal("value"));
rec.b1 = (decimal)reader.GetDecimal(reader.GetOrdinal("barometer"));
rec.b2 = (decimal)reader.GetDecimal(reader.GetOrdinal("barometer_prev"));
rec.recomend = reader.GetString(reader.GetOrdinal("recommend"));
list.Add(rec);
}
sqlConn.Close();
resultlist = list;
}
Но интуиция подсказывает, что должен быть метод вроде List<ModelType> Read<ModelType>();
2 часа уже гуглю, но ничего не выходит. На самом деле эти данные внутри c# кода часто и не нужны,
и мне их можно их сразу серилиазовать в JSON и от давать на клиент, но проблема в том, что и DataTable не сериализуется,
пишет что -то о рекурсивных ссылках
В общем прошу подсказать как это грамотно считать и сериализовать
SqlDataReader в List<object>
-
- Уже с Приветом
- Posts: 9195
- Joined: 04 Mar 2011 03:04
- Location: SFBA
Re: SqlDataReader в List<object>
Раз Пятница, то какая разница, кто настоящий эксперт в C#?
Ну, это как бы на основе Типа с переменными данных и Таблицы БД получить Список<название поля Таблицы, ссылка на переменную объекта Типа>, и затем по такому списку итеративно заполнять переменные объекта данными.
Или связывание кода с данными самим компилятором, который про данные не очень знает. Это понятно, что в языках вроде C# есть разные там reflection, чтение внутреннего устройства объектов run-time. Где-то там и копать? Или самому просто сделать некоторый Map<fieldNameStr, Model.fileld>, чтобы так рутинно поля не связывать со своей структурой? Или Map<fieldNameStr, lambda2WriteTheFiledInMyModelObj> но такой подход где-то на уровне писания своего фреймворка, для одноразового применения вряд-ли оправдан. И всё равно писать дополнительный код. Кроме как сканировать внутреннее устройство вашего класса по каким-то признакам, ну... переменные типа начинаются data_*, вот их * и bind с полями базы данных.
Ну, это как бы на основе Типа с переменными данных и Таблицы БД получить Список<название поля Таблицы, ссылка на переменную объекта Типа>, и затем по такому списку итеративно заполнять переменные объекта данными.
Или связывание кода с данными самим компилятором, который про данные не очень знает. Это понятно, что в языках вроде C# есть разные там reflection, чтение внутреннего устройства объектов run-time. Где-то там и копать? Или самому просто сделать некоторый Map<fieldNameStr, Model.fileld>, чтобы так рутинно поля не связывать со своей структурой? Или Map<fieldNameStr, lambda2WriteTheFiledInMyModelObj> но такой подход где-то на уровне писания своего фреймворка, для одноразового применения вряд-ли оправдан. И всё равно писать дополнительный код. Кроме как сканировать внутреннее устройство вашего класса по каким-то признакам, ну... переменные типа начинаются data_*, вот их * и bind с полями базы данных.
... and even then it's rare that you'll be going there...
-
- Уже с Приветом
- Posts: 15770
- Joined: 01 Mar 2008 15:14
Re: SqlDataReader в List<object>
Самому можно написать, но вы правы, смысла нет, и есть надежда, что уже написано. Нафига иначе среда может генерить классы Model с полями почеченными serializable?
-
- Уже с Приветом
- Posts: 4435
- Joined: 13 Feb 2002 10:01
- Location: Bay Area
-
- Уже с Приветом
- Posts: 23804
- Joined: 05 Jul 2003 22:34
- Location: Брест -> St. Louis, MO
-
- Уже с Приветом
- Posts: 2127
- Joined: 07 Nov 2000 10:01
- Location: San Diego, CA, USA
Re: SqlDataReader в List<object>
Когда то так делал - не reader, но может пригодится
Code: Select all
public static List<T> ConvertDataTable<T>(DataTable dt)
{
var columnNames = dt.Columns.Cast<DataColumn>().Select(c => c.ColumnName).ToList();
var properties = typeof(T).GetProperties();
var rows = dt.Rows;
var alist = new List<T>();
foreach (DataRow row in rows)
{
var obj = Activator.CreateInstance<T>();
foreach (var pro in properties)
{
if (columnNames.Contains(pro.Name))
{
try
{
pro.SetValue(obj,
pro.PropertyType.IsEnum
? Enum.ToObject(pro.PropertyType, row[pro.Name])
: row[pro.Name], null);
}
catch (Exception)
{
}
}
}
alist.Add(obj);
}
return alist;
}
Я гражданин Украины, киевлянин и я против хунты!
-
- Уже с Приветом
- Posts: 15770
- Joined: 01 Mar 2008 15:14
Re: SqlDataReader в List<object>
olegy, спасибо! Это искал. Странно, что нет в системных функциях
-
- Уже с Приветом
- Posts: 10396
- Joined: 04 Feb 2004 14:14
- Location: Edgewater, NJ
Re: SqlDataReader в List<object>
Насколько я помню, этого нет в системных функциях, потому, что DataTable не реализует getHash. Последнее - это необходимое требование для сериализации/дисериализации. Думаю, что, если расширить объект DataTable и DataRow в нем и внедрить данный метод, то будет сериализоваться сам.OtherSide wrote:olegy, спасибо! Это искал. Странно, что нет в системных функциях