SqlDataReader в List<object>

OtherSide
Уже с Приветом
Posts: 15770
Joined: 01 Mar 2008 15:14

SqlDataReader в List<object>

Post by OtherSide »

Я использую примерно такой код:

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 не сериализуется,
пишет что -то о рекурсивных ссылках

В общем прошу подсказать как это грамотно считать и сериализовать
User avatar
Medium-rare
Уже с Приветом
Posts: 9195
Joined: 04 Mar 2011 03:04
Location: SFBA

Re: SqlDataReader в List<object>

Post by Medium-rare »

Раз Пятница, то какая разница, кто настоящий эксперт в C#? :crazy:
Ну, это как бы на основе Типа с переменными данных и Таблицы БД получить Список<название поля Таблицы, ссылка на переменную объекта Типа>, и затем по такому списку итеративно заполнять переменные объекта данными.

Или связывание кода с данными самим компилятором, который про данные не очень знает. Это понятно, что в языках вроде 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...
OtherSide
Уже с Приветом
Posts: 15770
Joined: 01 Mar 2008 15:14

Re: SqlDataReader в List<object>

Post by OtherSide »

Самому можно написать, но вы правы, смысла нет, и есть надежда, что уже написано. Нафига иначе среда может генерить классы Model с полями почеченными serializable?
oshibka_residenta
Уже с Приветом
Posts: 4435
Joined: 13 Feb 2002 10:01
Location: Bay Area

Re: SqlDataReader в List<object>

Post by oshibka_residenta »

User avatar
katit
Уже с Приветом
Posts: 23804
Joined: 05 Jul 2003 22:34
Location: Брест -> St. Louis, MO

Re: SqlDataReader в List<object>

Post by katit »

EntiyFrameworks
+
DataContractSerializer
Лучше водки — хуже нет! ©
User avatar
olegy
Уже с Приветом
Posts: 2127
Joined: 07 Nov 2000 10:01
Location: San Diego, CA, USA

Re: SqlDataReader в List<object>

Post by olegy »

Когда то так делал - не 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;

        }
Я гражданин Украины, киевлянин и я против хунты!
OtherSide
Уже с Приветом
Posts: 15770
Joined: 01 Mar 2008 15:14

Re: SqlDataReader в List<object>

Post by OtherSide »

olegy, спасибо! Это искал. Странно, что нет в системных функциях
User avatar
IvanGrozniy
Уже с Приветом
Posts: 10396
Joined: 04 Feb 2004 14:14
Location: Edgewater, NJ

Re: SqlDataReader в List<object>

Post by IvanGrozniy »

OtherSide wrote:olegy, спасибо! Это искал. Странно, что нет в системных функциях
Насколько я помню, этого нет в системных функциях, потому, что DataTable не реализует getHash. Последнее - это необходимое требование для сериализации/дисериализации. Думаю, что, если расширить объект DataTable и DataRow в нем и внедрить данный метод, то будет сериализоваться сам.

Return to “Вопросы и новости IT”