Доброго времени суток.
Помогите с такой проблемой: мне нужно обойти датасет с большим количеством данных по записям. Но при вызове метода Open() процесс Террасофт отъедает 2 ГБ памяти и падает. Я так думаю, что это из-за большого количества записей. Поэтому интересуюсь, возможно ли программно получать данные из датасета порциями? В гридах же записи по 40 штук как-то отображаются.

Нравится

2 комментария

Так можно получить первые 40:

	Dataset.FetchRecordsCount =40;// -1 - все записи
	Dataset.Open();

Получать все порции по очереди можно попробовать с помощью фильтра по дате создания.

Спасибо, то, что нужно.

Показать все комментарии

Столкнулся с задачей, в которой требовалось пронумеровать строки в наборе данных и отобразить их в гриде, то есть отобразить колонку "№ п/п". Так как набор данных – это данные из определенной таблицы, полученные с помощью наложения нескольких фильтров, то номер строки необходимо было формировать динамически.
Использовать для решения этой задачи временную таблицу не хотелось, и после непродолжительных поисков обнаружил, что в MSSQL2005 появилась функция ROW_NUMBER(), возвращающая последовательный номер строки в результирующем наборе данных.
С помощью этой функции поставленная задача решилась очень просто:

  1. В сервис запроса (SelectQuery) добавить колонку с текстом SQL.
  2. В созданной колонке указать следующий текст ROW_NUMBER() OVER (ORDER BY tbl_Name.FieldName ASC), где аргумент ORDER BY используется для определения поля (и типа сортировки по нему), по которому будет определяться порядок присвоения порядкового номера строкам набора данных.
  3. В сервисе набора данных (Dataset) создать строковое поле, которое «привязать» к колонке, созданной в п.1 и добавить эту колонку в сервис грида (DataGrid).

 

Нравится

Поделиться

10 комментариев

А почему именно строковое поле?

Функция интересная, сам ее использовал http://msdn.microsoft.com/en-us/library/ms186734.aspx

Относительно "строковое поле" - хотелось бы услышать размышления автора :lol:

--
www.it-sfera.com.ua

Роман,
А чем не подошло это сво-во RowNumber?

И как решаете проблемы с сортировкой? Если скажем пользователь сортирует по другим полям? И с правами? Или Вы мержите текст колонки с текстом запроса?

"Underscore a.k.a. _" написал:А почему именно строковое поле?

Т.к. функция ROW_NUMBER() возвращает целое число, то можно создать в наборе данных и целочисленное поле. Но критично ли это для информационного поля - строка или число?
"Осауленко Александр" написал:А чем не подошло это сво-во RowNumber?

Не хотелось оперировать свойствами набора данных, а получить порядковый номер в одном запросе вместе с другими полями. Набор данных был мне нужен только для отображения информации, т.е. пользователь только читает его содержимое, без возможности изменения.
"Осауленко Александр" написал:И как решаете проблемы с сортировкой? Если скажем пользователь сортирует по другим полям? Или Вы мержите текст колонки с текстом запроса?

Проблемы с сортировкой я не решал, т.к. было известно поле, по возрастанию значения которого нумеруются записи. Если кто-то предложит решение с учетом сортировки в гриде, то я (думаю, и не только я) буду только благодарен автору решения.
"Осауленко Александр" написал: И с правами?

Нумеруются записи, которые пользователь смог выбрать из БД с учетом прав доступа.

"Романенко Роман" написал:Набор данных был мне нужен только для отображения информации, т.е. пользователь только читает его содержимое, без возможности изменения.

Соответственно зачем нагружать для этого сервер, если это только для красоты?

"Романенко Роман" написал:Нумеруются записи, которые пользователь смог выбрать из БД с учетом прав доступа.

Что будет если из таблицы нельзя будет читать? или из поля?

"Романенко Роман" написал:Но критично ли это для информационного поля - строка или число?

Просто тишина должна быть в библиотеке :) Вернее порядок. Меня просто больше интересовало обязательно ли строковое, а если да, то почему.
"Романенко Роман" написал:Если кто-то предложит решение с учетом сортировки в гриде

Александр же предложил. Берем Calc поле и вычисляем его как
Dataset.RecordNumber

"Романенко Роман" написал:Проблемы с сортировкой я не решал, т.к. было известно поле, по возрастанию значения которого нумеруются записи. Если кто-то предложит решение с учетом сортировки в гриде, то я (думаю, и не только я) буду только благодарен автору решения.

1. Использовать RowNumber, но я бы проверил его сначала:)
2. Получать текст запроса через DBEngine вытягивать Order by и вставлять его в SQL колонку. Где-то так.

"Underscore a.k.a. _" написал:Просто тишина должна быть в библиотеке :) Вернее порядок

Про порядок - согласен.
"Осауленко Александр" написал:Что будет если из таблицы нельзя будет читать? или из поля?

Честно говоря, не проверял, т.к. это искал решение для частного случая, который не предусматривает такие ограничения.
"Осауленко Александр" написал:1. Использовать RowNumber, но я бы проверил его сначала:)
2. Получать текст запроса через DBEngine вытягивать Order by и вставлять его в SQL колонку. Где-то так.

Как говорится, поле для универсализации решений практически не знает границ :). Спасибо за указание на "тонкие" места в решении.

А вас не смущает, что таким образом каждый раз в одном и том же наборе данных может быть разная нумерация?

"Владимир Соколов" написал:А вас не смущает, что таким образом каждый раз в одном и том же наборе данных может быть разная нумерация?

Если постоянно менять значения поля, по которому сортируются данные при нумерации, то при каждом формировании набора нумерация и будет разной.
Но задаче ведь заключается в том, чтобы пронумеровать набор данных полученных именно сейчас, без огладки на "прошлые разы".

Показать все комментарии