Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.09.2012, 20:06   #1
andrew_jr20
Пользователь
 
Регистрация: 01.06.2011
Сообщений: 53
По умолчанию DataTable некорректно загружает набор данных из DataReader

Добрый день
Имеется некоторый запрос
Код:
SELECT a, b, c, d FROM tbl ORDER BY a
который возвращает набор из 3 строк, отличающихся только колонкой "с".
Если проходить по этому запросу datareader'ом, то все три строки считываются нормально. Если этот запрос загружать в таблицу через DataTable.Load(datareaderName) и проходить потом по нему через

Код:
foreach (DataRow dr in dt.Select("", ""))
- то в указанном случае тоже всё нормально (хотя на других запросах ломается сортировка, указанная в основном запросе к базе).
Чтобы не ломать сортировку, убрал order by из запроса и перенёс её непосредственно в выборку из таблицы, вот так:

Код:
foreach (DataRow dr in dt.Select("", "а"))
На других запросах, с сильно различающимися результатами, такая конструкция отрабатывает корректно - т.е. dt.Select возвращает необходимое количество строк, а для моего запроса с результатом, отличающимся лишь одной колонкой, возвращается всего одна строка.
То есть если запрос из базы возвращает такие 3 строки:
Код:
1 2 3 4
1 2 5 4 
1 2 8 4
То Select вернёт только одну, первую строку.
Даже если после Load(datareader) проверить количество загруженных строк, то есть посмотреть dt.Rows.Count - числа будут отличаться.
Как можно побороть эту особенность DataTable, то есть загружать именно то, что возвращает DataReader, не производя сортировок и удалений повторов?
andrew_jr20 вне форума Ответить с цитированием
Старый 02.09.2012, 00:04   #2
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Да нет никаких особенностй у DataTable, надо просто прочитать справку и понять что к чему.
eval вне форума Ответить с цитированием
Старый 02.09.2012, 09:28   #3
andrew_jr20
Пользователь
 
Регистрация: 01.06.2011
Сообщений: 53
По умолчанию

MSDN по datatable читал - там ничего подобного и нет, никаких нюансов не отмечено о том, что идёт автоматическая сортировка или distinct
andrew_jr20 вне форума Ответить с цитированием
Старый 02.09.2012, 10:56   #4
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Так я и говорю, что нет. Вы просто неправильно что-то делаете, а что-то это то что селект делаете а зачем, почему?
Цитата:
хотя на других запросах ломается сортировка, указанная в основном запросе к базе
что это за мефические другие?
eval вне форума Ответить с цитированием
Старый 02.09.2012, 13:00   #5
andrew_jr20
Пользователь
 
Регистрация: 01.06.2011
Сообщений: 53
По умолчанию

Селект - для того, чтобы по всем рядам пройтись и сделать то, что нужно, или есть какой-то другой вариант все ряды обойти? Я пока только этот нашёл.
А другие запросы - если я делаю сложный запрос к базе по нескольким таблицам с 2-3 сортировками, то в итоге при загрузке в datatable сортируется всё по первому столбцу.
andrew_jr20 вне форума Ответить с цитированием
Старый 02.09.2012, 13:04   #6
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Вариантов много
foreach (var row in dt.Rows)
foreach (var row in dt.DefaultView)
...
eval вне форума Ответить с цитированием
Старый 02.09.2012, 15:50   #7
andrew_jr20
Пользователь
 
Регистрация: 01.06.2011
Сообщений: 53
По умолчанию

Ну да - можно и так, но меня больше интересует вариант, когда селектом на клиенте выполняется необходимая именно для данного случая сортировка.
И в целом до селекта дело даже не доходит - выше я писал, что если сразу после dt.Load(datareader) проверить количество рядов, загруженных из базы - их окажется не 3, как должно быть в данном случае, а 1 ряд, и получается, что неважно - как потом я по рядам буду проходить, если ряд всего 1.
andrew_jr20 вне форума Ответить с цитированием
Старый 02.09.2012, 16:00   #8
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
выше я писал
Значит либо из базы идет только 1 запись либо еще чего. В общем случае все должно быть ОК.
eval вне форума Ответить с цитированием
Старый 02.09.2012, 17:25   #9
andrew_jr20
Пользователь
 
Регистрация: 01.06.2011
Сообщений: 53
По умолчанию

Так я и говорю - из базы в данном случае идёт 3 строки, то есть если вместо работы с dt пробегаться по результату, используя while (dataReader1.Read()) - то будет именно 3 строки, а если применять dt, то в dt попадает только одна строка.
Вкратце об исходных таблицах: одна из таблиц - с заказами, вторая - справочник исполнителей, которые эти заказы могут выполнить, и в результате запроса будут те самые 3 строки, где меняется только потенциальный исполнитель. Впоследствии тем сотрудникам, которые подпадают под этот запрос, уходят уведомления - и они уже дальше разбираются, но выходит так, что datatable воспринимает уникальные записи из таблицы заказов как одну строку, не обращая внимания на исполнителя (хотя в этой строке сама колонка исполнителя будет).
Первоначальный запрос полнее выглядит так:
Код:
SELECT a, b, c, d FROM tbl, tbl 2 where tbl.a=tbl2.id
И если поменять его на
Код:
select * from (SELECT a, b, c, d FROM tbl, tbl 2 where tbl.a=tbl2.id) t
то проблемы никакой нет, в dt загружается 3 строки, и работа идёт уже как надо, с 3 строками.
andrew_jr20 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DataTable и DataGridView Дупло Помощь студентам 0 19.11.2011 20:15
Набор данных и загрузка другой таблицы Turbine БД в Delphi 1 21.03.2011 14:26
Получить набор данных из MS SQL по параметрам в ячейках Stilet Microsoft Office Excel 5 13.10.2010 18:26
тормозит DataTable billidean Общие вопросы .NET 0 24.08.2008 13:10