Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Обобщения / 6 сообщений из 6, страница 1 из 1
30.07.2013, 15:49
    #38348945
VIT2708
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обобщения
Хотел бы написать один обобщенный метод так как надоело каждый раз писать

пример кода

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
public List<Класс> GetList()
{
List<Класс> Name = new List<Класс>();
using (SqlConnection sqlConn = new SqlConnection(ConnectionString))
{
....
SqlDataReader _dr;
 while (_dr.Read())
                {
                    Класс k = new Класс();
                    k.ID = _dr.GetInt64(0);
                    k.Title = _dr.GetString(1);
                    k.Active = _dr.GetBoolean(2);
                    //строк может быть как больше так и меньше
                    if (k != null) { Name.Add(k); }
                }
                _dr.Close();
}



А хочется написать что то вроде

Код: c#
1.
2.
3.
4.
5.
public List<T> GetList(string storedprocedure, SqlParametr[] commandparametr)
{
List<T> Name = new List<T>();
//.....
}


и просто в эту функцию передавать обьекты а не писать каждый раз новую функцию.


Но вот как написать функционал чтения я никак не могу понять, если это возможно и правильно.

Спасибо.
...
Рейтинг: 0 / 0
30.07.2013, 15:56
    #38348970
Паганель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обобщения
ORM спасет?
...
Рейтинг: 0 / 0
30.07.2013, 16:08
    #38349011
VIT2708
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обобщения
Паганель,

Проект писали еще до меня так что не спасет меня ORM переписывать многовато нужно.

Да и обобщения неплохо было бы знать
...
Рейтинг: 0 / 0
30.07.2013, 16:39
    #38349105
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обобщения
Если писали методом копипасты (похоже на то), то такой код хорошо распарсивается и переписывается автоматизированно, а вручную за скриптом лишь ошибки правятся.

Впрочем, этот метод рефакторинга лишь для маньяков )
...
Рейтинг: 0 / 0
30.07.2013, 17:06
    #38349159
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обобщения
VIT2708, одними дженерики здесь не обойтись т.к. в любом случае нужен код для чтения данных из SqlDataReader и записи в экземпляр объекта. Может помочь использование automapper (или аналогичной библиотеки) - Mapping From IDataReader/IDataRecord with AutoMapper

Присоединяюсь к совету Паганеля насчет ORM. Совсем необязательно переписывать всё приложение сразу. Можно мигрировать постепенно. Главное в итоге завершить миграцию, чтобы не было мешанины способов доступа к БД.

VIT2708
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public List<Класс> GetList()
{
	List<Класс> Name = new List<Класс>();
	using (SqlConnection sqlConn = new SqlConnection(ConnectionString))
	{
	....
		SqlDataReader _dr;
		while (_dr.Read())
		{
			Класс k = new Класс();
			k.ID = _dr.GetInt64(0);
			k.Title = _dr.GetString(1);
			k.Active = _dr.GetBoolean(2);
			//строк может быть как больше так и меньше
			if (k != null) 
			{
				Name.Add(k);
			}
		}
	_dr.Close();
}


Несколько предложений по вышеприведенному коду:
1) Условие if (k != null) всегда истинно, убери его.
2) Добавь using вокруг SqlDataReader
3) Не советую читать данные из data reader-ов через код вида _dr.GetString(1). Выигрыш в скорости будет незначительным. Риск же сломать код путем безобидной перестановки колонок в запросе является более реальным. Также это ухуждает читабельность. Если не хочется постонно писать код вида _dr.GetInt64(_dr.GetOrdinal("IntColumn")), то никто не мешает написать extension метод для IDataReader который позволит работать с именем колонки - _dr.GetInt64("IntColumn").
...
Рейтинг: 0 / 0
30.07.2013, 17:12
    #38349163
VIT2708
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обобщения
bazile,

Спасибо
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Обобщения / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]